interface , abstract , virtual 差異

C# interface , abstract , virtual 差異 解說.....

以前大學時代學C++,其實對於物件導向的功能與觀念還算清楚,不過畢業後反來很少用到物件導向的進階功能,慢慢的很多東西的定義就慢慢忘掉了....

重溫一下基本...雖然也不一定會常用到

interface , abstract , virtual 這幾個東西其實都很像,簡單來說都可以讓後面繼承的對像自己去實作 or 修改 method,常常會搞混,找網路教學說了一堆,說了一堆有的沒的,感覺最快還是自己測試一下各功能的sample,馬上就會知道差異,用了那種關鍵字,那種功能是ok的,怎樣是不ok的,一目了然.

網路很多都這種教學例子... 其實如果能很輕易看懂這類文章的人,大概都是已經會了的人.

 http://missrices.pixnet.net/blog/post/28220534 

http://jjnnykimo.pixnet.net/blog/post/21585257

so...既然已經會了的人才容易看懂,那又何必看呢?

PS.簡單來說...以功能導向的小程式,做些小DMEO跑一下,列出結果差異,就明白了.

namespace MySample
{
    //介面
    interface SampleInterFace
    {
        void testMethod();

        //下面反註解掉會編譯錯誤,介面的method被實做必定得是public屬性,但本身不能宣告屬性
        //public void testMethod();

        //下面反註解掉會編譯錯誤,介面裡頭不能宣告fields
        //int test;

        //下面反註解掉會編譯錯誤,介面裡頭不能有任何真正實做
        //void testMethod() { }
    }

    class test1 : SampleInterFace
    {
        //若沒這下面實作,會編譯報錯
        public void testMethod()
        {
            throw new NotImplementedException();
        }
    }


    //抽像
    abstract class Sampleabstract
    {
        abstract public void testMethod();

        //下面反註解掉會編譯錯誤,抽像類別中無實作的method一定得加上abstract關鍵字
        //public void testMethod2();

        //抽像類別中可以實作method
        public void testMetod2()
        {
            Console.WriteLine("hello");
        }

        //抽像類別中可以定義fields
        int test = 0;
    }


    class test2 : Sampleabstract
    {
        //有abstract關鍵字的methed "一定需要用" override實作
        public override void testMethod()
        {
            throw new NotImplementedException();
        }
    }


    class Sampleclass
    {
        virtual public void testMethod()
        {
            Console.WriteLine("hello");
        }

        //下面反註解掉會編譯錯誤,virtual必定需要為public屬性
        //virtual void testMethod() { }

        //下面反註解掉會編譯錯誤,virtual必定需要實作
        //virtual public void testMethod();
    }

    class test3:Sampleclass
    {
        //有virtual關鍵字的methed "可以用"  override實作
        public override void testMethod()
        {
            throw new NotImplementedException();
        }
    }
}