C#設計模式-衍生類別實現非虛介面陷阱的執行個體代碼分享

來源:互聯網
上載者:User

理解介面方法和虛方法的區別

  第一眼看來,實現介面和覆寫虛方法似乎沒有什麼區別,實際上,實現介面和覆寫虛方法之間的差別很大!!!

派生不能覆寫介面的非虛成員

  介面中聲明的成員方法預設情況下並非虛方法,所以,衍生類別不能覆寫基類中實現介面的非虛成員。
看一個例子。
定義介面ITest:

    public interface ITest    {        void Test();    }

實現介面的Base類和Derive類

    public class Base:ITest    {        public Base()        {            Console.WriteLine("This is base constructor");        }        //實現ITest介面        public void Test()        {            Console.WriteLine("This is in base to ITest implement");        }    }    public class Derive :Base,ITest    {        public Derive()        {            Console.WriteLine("This is derived constructor");        }        //測試Derive類實現了ITest嗎??        public void Test()        {            Console.WriteLine("This is in Derive to ITest implement");        }    }

調用對象Base和Derive:

            Base b = new Base();            b.Test();            Base d = new Derive();//將d聲明為Base對象            d.Test();            Console.ReadLine();

輸出結果為:



  可以看出,b和d執行個體的Test方法實現的行為都是位於基類的!!!這表明了,衍生類別不能覆寫基類中實現介面的成員(非虛方法)

但是,請看下面調用:

            Base b = new Base();            b.Test();            Derive d = new Derive(); //將d聲明為Derive對象            d.Test();            Console.ReadLine();

輸出結果為:



因此,如果想要繼承的對象調用介面實現方法,只能聲明為Derive執行個體。這樣做不符合Effective C#中變數都聲明為基執行個體的原則!!!

衍生類別方法個性,將基類方法轉為虛方法

  避免這種使用上的混淆,如果確實衍生類別實現方法是個性行為,那麼需要將基類的實現介面的方法前加virtual修飾符!
代碼修改如下:

public class Base:ITest    {        public Base()        {            Console.WriteLine("This is base constructor");        }        public virtual void Test() //實現ITest介面的虛方法        {            Console.WriteLine("This is in base to ITest implemnt");        }    }    public class Derive :Base,ITest    {        public Derive()        {            Console.WriteLine("This is derived constructor");        }         public override void Test() //實現介面ITest的複寫方法        {            Console.WriteLine("This is in Derive to ITest implemnt");        }    }

一次實現,多個關聯對象使用

  觀察上面的代碼,我們發現,在基類中實現的介面,如果衍生類別也想實現此介面,那麼它預設繼承了基類的介面實現,所以不用重複寫代碼實現介面。

   public interface ITest    {        void Test();    }    public class Base:ITest    {        public Base()        {            Console.WriteLine("This is base constructor");        }        public void Test()        {            Console.WriteLine("This is in base to ITest implemnt");        }    }    public class Derive :Base,ITest    {        public Derive()        {            Console.WriteLine("This is derived constructor");        }    }

總結:
1、 派生不能覆寫介面的非虛成員;
2、如果衍生類別方法是個性方法,將基類方法轉為虛方法;
3、若基類實現了介面方法,將衍生類別也顯示地繼承此介面,但是不用再次實現了!!!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.