繼承(Inheritance):描述依據現有類別來建立新類別的能力。
一個物件A得到另一個物件B特性的過程稱為“A繼承B”,物件B則屬於“父類別”或稱基礎類別(Base class),物件A則屬於子類別或稱為衍生類別(Derived class)。
本文以C#實作執行介紹。
子類別可以繼承父類別的能力,直接使用父類別非私有的屬性和方法。
子類別只能繼承一個父類別。
父類別的方法若宣告為虛擬(virtual),則表示該方法可以被子類別覆寫(非必需)。
父類別的方法若宣告為抽象(abstract),則表示該子類別一定要覆寫該方法(子類別為抽象類別除外)。
類別若包含抽象成員,則該類別必需宣告為抽象類別。
父類別又叫做基底類別(Base Class)。
子類別又叫做衍生類別(Derived Class)。
若方法或屬性宣告為密封(sealed),則不可以被子類別覆寫
先定義父類別(基底類別):
class Employee //定義Employee員工類別
{
private int _salary; //Employee員工類別有Salary薪水屬性
public int Salary
{
get
{
return _salary;
}
set
{
if (value < 20000) //薪水最少20000
_salary = 20000;
else if (value > 40000) //薪水最多40000
_salary=40000;
else
_salary = value;
}
}
}
定義子類別(衍生類別)來繼承父類別:
//Manager經理類別繼承自Employee員工類別
class Manaeger : Employee
{
public int Bonus { get; set; }//加入Bonus獎金屬性
public void ShowTotal()
{
Console.WriteLine("實領薪水:{0}",Bonus+Salary);
}
}
讓我們來看看這個方法:
public void ShowTotal()
{
Console.WriteLine("實領薪水:{0}",Bonus+Salary);
}
Salary屬性是子類別繼承自父類別,可以直接使用,而無須額外宣告。
以下是完整程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Inherits
{
class Employee //定義Employee員工類別
{
private int _salary; //Employee員工類別有Salary薪水屬性
public int Salary
{
get
{
return _salary;
}
set
{
if (value < 20000) //薪水最少20000
_salary = 20000;
else if (value > 40000) //薪水最多40000
_salary=40000;
else
_salary = value;
}
}
}
//Manager經理類別繼承自Employee員工類別
class Manaeger : Employee
{
public int Bonus { get; set; }//加入Bonus獎金屬性
public void ShowTotal()
{
Console.WriteLine("實領薪水:{0}",Bonus+Salary);
}
}
class Program
{
static void Main(string[] args)
{
Employee Jerry = new Employee();//建立Employee員工類別的Jerry物件
Jerry.Salary = 40000;//設定薪水
Console.WriteLine("Jerry員工薪水{0}",Jerry.Salary);//顯示薪水
Console.WriteLine("==========");
Console.WriteLine();
Manaeger Squell = new Manaeger();//建立Manager經理類別Squell物件
Squell.Salary = 50000;//設定薪水
Console.WriteLine("Squell經理薪水{0}",Squell.Salary);//顯示薪水
Squell.Bonus = 30000;//設定Squell的獎金30000
Console.WriteLine("Squell經理獎金{0}",Squell.Bonus);
Squell.ShowTotal();//顯示Squell實領薪水
Console.ReadKey();
}
}
}
執行結果如下:
若方法或屬性宣告為密封(sealed),則不可以被子類別覆寫範例程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace @sealed
{
class X
{
public virtual void F() { Console.WriteLine("X.F"); }
public virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed public override void F() { Console.WriteLine("Y.F"); }
public override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
//public override void F() { Console.WriteLine("C.F"); }
// Overriding F2 is allowed.
public override void F2() { Console.WriteLine("Z.F2"); }
}
class Program
{
static void Main(string[] args)
{
X x = new X();
Y y = new Y();
Z z = new Z();
x.F();
x.F2();
y.F();
y.F2();
z.F();
z.F2();
Console.Read();
}
}
}
在Z繼承Y的時候,因為Y當中的F已經被宣告成sealed了,所以Z並不能去覆寫類別Y當中的F方法,如果覆寫的話會出現錯誤:
// Attempting to override F causes compiler error CS0239.
//public override void F() { Console.WriteLine("C.F"); }
執行結果如下:
虛擬(virtual)和抽象(abstract)的介紹和多型有密切的關聯,故將在" C# 物件導向程式設計(Object-oriented programming,OOP) (四) 多型" 中介紹。
有夢最美 築夢踏實
活在當下 認真過每一天
我是阿夢 也是Ace