介面與抽象類

iDotNetSpace發表於2009-03-10
 這幾天在寫一個記賬管理的小程式,在這個程式中遇到了可能很多人都要遇到的問題。

  一,介面的使用

  二,介面和抽象類

  問題一,介面的使用

  如下的列子

interface IFly
    {
        void Fly();
    }

    class Bird : IFly
    {
        public void Eat()
        {
       
        }

        #region 實現介面

        public void Fly()
        {
            //用翅膀飛
        }

        #endregion
    }

    class Plan : IFly
    {
        #region IFly 成員

        public void Fly()
        {
            //噴氣飛行
        }

        #endregion
    }

    static class Mid
    {
        public static IFly GetBirdFly()
        {
            return new Bird();
        }

        public static IFly GetPlanFly()
        {
            return new Plan();
        }
    }

    class Test
    {
        IFly Birds = Mid.GetBirdFly();
        public void Tests()
        {
            Birds.Fly();
            Birds.Eat();//錯誤。找不到相關的方法!
        }
    }

 

從上面的列子可以看出,當你申明瞭一個介面以後。你只是說明了 繼承這個介面的類 可以做什麼

具體怎麼做。需要你再派生類中實現!

當你公佈一個介面,並給出相應的靜態方法時。使用者只能使用該介面的方法,而不可以使用那麼是派

生類中的公共方法!

 

這時候會有人說。這樣的話。抽象類 也可以實現。

沒錯。抽象類也可以完成上面的功能;

 

這時候我們再對上面的列子進行擴充!

比如。我們現在要詳細區分各種型別的鳥,飛機

如,噴氣飛機,戰鬥機

鷹,鴿子

這時我們要對上面的程式碼進行修改

先讓我們完全用介面來實現

interface IFly
    {
        void Fly();
    }

    interface I攻擊
    {
        void 攻擊();
    }

    interface I吃加油
    {
        void 吃();
    }

    interface I乘坐
    {
        void 乘坐();
    }

    interface I送信
    {
        void 送信();
    }

    class 噴氣飛機 : IFly, I乘坐,I吃加油
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region II乘坐 成員

        public void 乘坐()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成員

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    class 戰鬥機 : IFly, I乘坐, I吃加油,I攻擊
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I乘坐 成員

        public void 乘坐()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成員

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I攻擊 成員

        public void 攻擊()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    class 鷹 : IFly, I吃加油, I攻擊
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成員

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I攻擊 成員

        public void 攻擊()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    class 鴿子 : IFly, I吃加油, I送信
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成員

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I送信 成員

        public void 送信()
        {
            throw new NotImplementedException();
        }

        #endregion
    }


如上述的情況。我們如使用抽象類,則實現起來就比較複雜,因為類只能繼承一個抽象類。
我們不得不為每個具體的例項類去寫合適的抽象類。
但是似乎上面的程式碼又顯得有些囉嗦。如 噴氣飛機和戰鬥機,他們都有區域性相同性,他們都是飛機,他

們要加油,都可以飛,都可以乘坐,唯一的不同是,噴氣飛機不能攻擊,而戰鬥機可以攻擊。
鷹和鴿子也一樣,他們都具有相同的行為,同時有具有不同的行為
我們修改下面的方法
interface IFly
    {
        void Fly();
    }

    interface I攻擊
    {
        void 攻擊();
    }

    interface I送信
    {
        void 送信();
    }

    abstract class 飛機
    {
        public abstract void 乘坐();

        public abstract void 加油();
    }

    abstract class 鳥
    {
        public abstract void 吃();
    }

    class 噴氣飛機 : 飛機,IFly
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion      
   
        public override void 乘坐()
        {
            throw new NotImplementedException();
        }

        public override void 加油()
        {
            throw new NotImplementedException();
        }
    }

    class 戰鬥機 : 飛機,IFly,I攻擊
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion
       
        #region I攻擊 成員

        public void 攻擊()
        {
            throw new NotImplementedException();
        }

        #endregion

        public override void 乘坐()
        {
            throw new NotImplementedException();
        }

        public override void 加油()
        {
            throw new NotImplementedException();
        }
    }

    class 鷹 : 鳥,IFly,  I攻擊
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion       

        #region I攻擊 成員

        public void 攻擊()
        {
            throw new NotImplementedException();
        }

        #endregion

        public override void 吃()
        {
            throw new NotImplementedException();
        }
    }

    class 鴿子 :鳥, IFly, I送信
    {

        #region IFly 成員

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion


        #region I送信 成員

        public void 送信()
        {
            throw new NotImplementedException();
        }

        #endregion

        public override void 吃()
        {
            throw new NotImplementedException();
        }
    }

這次我們使用了抽象類來定義了兩個抽象的事物,1 飛機,2鳥,他是抽象的,我們無法從飛機或者鳥中

給你一個具體的飛機,或者一隻具體的鳥,但是所有的飛機和鳥都有這個抽象的行為,或者能力,
同時。不同的例項有具有不同的能力,如 攻擊,和送信。
當然。我們可以再飛機的抽象類中加入一個飛的方法
但是我們使用介面來做是因為,鳥也可以飛,
這兩類不同的事物再這裡有相同的行為,只不過他們的實現不同而已。

我認為介面和抽象類並不存在用這個好,用那個不好的情況,我認為要從他們中級找出一個分界線,他

們在一個程式中應該根據程式的需求而相互扶助,已達到期望的效果

這就是我這幾天所理解的介面和抽象類,不知道理解的是否正確,還希望大家指點!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-566607/,如需轉載,請註明出處,否則將追究法律責任。

相關文章