c# 多態的理解


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"); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM