今天要來說明一個簡單的觀念,但對於初學物件導向的我,著實花了一些時間才理解這個用法.
那就是為什麼要把一個變數宣告成為介面類型????
書裡面都說介面是不包含實現的,只能就欄位或方法做宣告,再由繼承的類裡面去做實作.也就是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);
}
這樣同一個方法就能適用實作相同介面的所有類別了.
這就是為什麼使用介面來宣告一個變數的原因.
留言列表