今天要來說明一個簡單的觀念,但對於初學物件導向的我,著實花了一些時間才理解這個用法.

那就是為什麼要把一個變數宣告成為介面類型????

書裡面都說介面是不包含實現的,只能就欄位或方法做宣告,再由繼承的類裡面去做實作.也就是interface不能去new它的.

當我看到  IRound rnd = new Circle(10); 時,心想這是在幹麻,為什麼要這麼做,這麼做有什麼好處,一般不是都 Circle rnd = new Circle(10);

在網上找了一些說明,可能是太簡單的觀念,所以文章大多順理成章的這麼用,也沒講到為什麼要宣告成介面.

細究一下,將心得和大家分享

以文字來敍述,就是介面就是不同的類但有的共同行為,當一個方法所需的只是這個共通行為來運作時,就可以把許多不同的類塞到同一個介面,而方法定義參數是介面型態,就可以同時服務不同的類,而不用重複定義方法.

呵呵.....如果你跟我一樣是初學,看得懂才有鬼

我們來看例子好了

先定義個介面,裡面包含了一個屬性

public interface IRound
    {
        double Radius { get; set; }
    }

再來我們來宣告一個類,並實作這個介面,很簡單的只是一個包含double參數的建構式,並實作了介面的Radius的屬性

public class Circle : IRound
    {
        private double rad;
        public Circle(double radius)
        {
            this.rad = radius;
        }

        public double Radius
        {
            get
            {
                return rad;
            }
            set
            {
                rad = value;
            }
        }
    }

正常我們要使用這個類別時,宣告的方法會像下面一樣

Circle rnd = new Circle(10);

那我們要將Circle物件 rnd再交給其他方法(例子中是MyTest())進行處理時,通常會使用

MyTest(rnd);

而你的MyTest方法會像下面例子一樣

private static void MyTest(Circle rnd)
        {
            Console.WriteLine(rnd.Radius);
        }

這樣就能運作了,但這有個問題,如果今天又有第二個類別叫Circle2,那你的MyTest(Circle rnd)就不能用了,因為它的參數是Circle類別,

所以你要再宣告一個MyTest(Circle2 rnd2)來處理內容是相同的事情,那假設有100個類別要做呢??

所以才會使用介面來做,假設這100個類都實作了同一個介面,我們可以這樣來宣告

IRound rnd1 = new Circle(10);

.......................

IRound rnd100 = new Circle100(10);

使用方法時一樣

MyTest(rnd1);

.........................

MyTest(rnd100);

所有類別的實體都會被塞入介面IRoundl中,並傳送到MyTest()中,這時我們只要修改MyTest方法如下

private static void MyTest(IRound rnd)
        {
            Console.WriteLine(rnd.Radius);
        }

這樣同一個方法就能適用實作相同介面的所有類別了.

這就是為什麼使用介面來宣告一個變數的原因.

arrow
arrow
    創作者介紹
    創作者 痞客興 的頭像
    痞客興

    痞客興的部落格

    痞客興 發表在 痞客邦 留言(0) 人氣()