標籤:
本人在於鞏固基礎知識,高手可以繞道
我們先來看看微軟中關於繼承的敘述:類可以從其他類中繼承。這是通過以下方式實現的:在聲明類時,在類名稱後放置一個冒號,然後在冒號後指定要從中繼承的類(即基類)
public class A{ public A() { }}public class B : A{ public B() { }}
C#的繼承與 C++ 等語言一個重要的不同,就是只能從一個類中繼承,這是開發人員在權衡了從多個類C#繼承的優勢與劣勢作出的結果。不過,可以從介面繼承。另外,繼承可傳遞。
也可以在繼承其他類的同時繼承多個介面例如:
public class ClassB : ClassA,Interface1,Interface2
如果基類成員是protected那麼只有繼承他的子類可以訪問,如果基本是sealed 那麼表示他不可以被繼承
也可以繼承一個抽象類別
public abstract class ClassC
public class ClassD:ClassC
C#繼承中的重寫
- virtual 用在基類中,指定一個虛方法(屬性),表示這個方法(屬性)可以重寫。
- override 用在衍生類別中,表示對基類虛方法(屬性)的重寫。
以上的基類和衍生類別都是相對的。B 是 C 的基類,也可以是 A 的衍生類別,B 中既可以對 A 中的 virtual 虛方法用 override 重寫,也可以指定 virtual 虛方法供 C 重寫。
不能重寫非虛方法或靜態方法。重寫的基方法必須是 virtual、abstract 或 override 的。為什麼 override 也可以重寫呢?因為基類中的 override 實際上是對基類的基類進行的重寫,由於繼承可傳遞,所以也可以對基類中 override 的方法進行重寫。
- override 聲明不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的存取層級修飾符。
不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
- 重寫屬性聲明必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱,並且被重寫的屬性必須是 virtual、abstract 或 override 的。
public class ClassA { public virtual void MethodA()//virtual關鍵詞表示這個方法可以重寫 { Console.WriteLine("this is ClassA"); } }
public class ClassE:ClassA { public override void MethodA() { base.MethodA();//這個可以不要
//下面就是你想要重寫的部分 Console.WriteLine("this is ClassE"); } }
static void Main(string[] args) { ClassE e = new ClassE(); e.MethodA(); }
ClassE繼承了ClassA 同時也繼承了他所有的成員包括這個虛擬方法,在ClassE中,我們重寫了這個虛擬方法,添加新的東西,最後調用,調用中先執行基類的虛擬方法,然後執行你需要的重寫的部分
public ClassA(string field) { FieldA = field; }
public ClassE(string field):base(field) { FieldA = field; }
public override void MethodA()
{
Console.WriteLine(base.FieldA);
}
ClassE e = new ClassE("demo"); e.MethodA();
最後會輸出一個: demo
子類建構函式繼承父類時首先會調用父類的建構函式
C#繼承