namespace console_父類子類 { class Program { public static void Main(string[] args) { showTest t = new showTest(); // 情況1 默認情況下調用父類的方法 t.show(new Son1()); //"i·m parent..." // 情況2 通過virtual 或 abstract 子類用 override 重寫方法參與虛調用 // c# 不能多繼承,派生類重寫某個虛擬成員時,即使該派生類的實例被當作基類的實例訪問,也會調用該成員 // 理解上面這句話很重要,當派生再次被繼承時,他也是只調用實現了重寫的虛方法,反之則調用最近實現重寫的方法 // 如果都沒有實現則還是調用 基類的方法 t.show(new Son1()); //"i·m son1..." t.show(new Son2()); //i·m son2... // 情況3 派生類通過new 來阻止 被調用 t.show(new Son1()); //i·m parent... // 情況4 當派生中擁有相同的成員時 Console.WriteLine(((Parent)new Son1()).test1); // 情況5 當父類定義虛方法virtual 派生必須實現方法,new關鍵字可以阻止被調用 // sealed 可以停止虛擬繼承 t.show(new Son2()); //"i·m son2..." // 報錯 因為父類中相同的方法已經被sealed 修飾停止了虛擬繼承
// sealed 限制的是派生類被重寫
t.show(new SonSon()); Console.ReadKey(true); } public static void test(IPerson p){ p.test(); } } //一個測試類 class showTest{ public void show(Parent p){ p.test(); } public void showproperty(Parent p){ Console.WriteLine(p.test1); } } //定義一個父類 class Parent{ //定義基類方法, 派生類重新次方法,默認情況下調用父類 public string test1 {get {return p;}} public string p = "p"; public virtual void test(){ Console.WriteLine("i·m parent..."); } } //子類 class Son1 : Parent { public string test1 {get {return p;}} public string p = "s"; public override void test(){ Console.WriteLine("i·m son1..."); } } //子類 class Son2 : Parent { public override void test(){ Console.WriteLine("i·m son2..."); } } class SonSon : Son2{ public override void test(){ Console.WriteLine("i`m sonson..."); } } interface IPerson{ void test(); } class Son3 : IPerson{ public void test(){ Console.WriteLine("i`m son3"); } } }