思考一: C#中接口和抽象類的使用上的區別:
---------------YYC
1、抽象類不能被實例化,但能擁有自己的成員字段和非抽象的方法,但接口比抽象類更加抽象,其成員只能是3、接口、抽象類、非抽象類都可以繼承接口
4、繼承接口後對其接口方法的實現:
實現可以分為“顯示實現”和”隱式實現“
interface Interface1
{
int GetInt();
//派生類必須實現接口類裡面的每一個方法
}
class cl1 :Interface1
{
public int GetInt() //隱式實現
{
return 1;
}
}
class cl2 : Interface1
{
public int GetInt()//隱式實現
{
return 2;
}
int Interface1.GetInt()//顯示實現
{
return 4;
}
}
其中兩者的區別是:隱式實現的方法既可以同接口對象調用,也可以通過派生類的實例來調用。
而對於顯示實現的方法只可以通過接口對象來調用。而且顯示實現時該方法前不能加任何的訪問
修飾符,其實默認的為隱式的,所以派生類的對象不能調用該方法。
思考二:接口在C#中出現的意義。
一、解決了多態和動態隱藏不能統一的問題。
a、動態隱藏:在沒有接口機制的動態隱藏是通過new關鍵字來隱藏基類的方法,從而
實現了基類對象和派生類對象通過使用相同方法名分別調用不同的方法;而在有接口的機制中是通過對於接口中的接
口方法的隱式實現和顯示實現同時共存的方法來實現接口對象和派生類對象通過使用相同方法名分別調用不同的方法。
For example://接口的動態隱藏
cl2 c2 = new cl2();
Interface1 iter = c2;
MessageBox.Show(c2.GetInt());//輸出2 ------會調用隱式方法
MessageBox.Show(iter.GetInt());//輸出4 -------會調用顯示方法
b、多態的實現:在沒有接口的機制中,多態的實現是通過使用關鍵字abstract/virtual--override的重載來實現
的;而在接口機制中的多態直接通過顯示實現多隱式實現都可以完成。
For example://接口的多態
cl1 c1 = new cl1();
cl2 c2 = new cl2();
Interface1 iter = c1;
MessageBox.Show(iter.GetInt());//輸出1
Interface1 iter = c2;
MessageBox.Show(iter.GetInt());//輸出4 --------會調用顯示方法,如果沒有顯示實現則會調用隱式實現方法。
c:問題:關鍵問題就是在沒有接口的機制中new機制和abstract/virtual--override不能同時出現,但是
在接口機制中通過同時顯示實現和隱式實現方法共存,就可以很輕松的解決該問題了。在C#接口機制下的動態
隱藏和多態同時實現有至少三種模式:
For example:
/*模式一:*/
cl1 c1 = new cl1();
cl2 c2 = new cl2();
Interface1 iter = c1;
MessageBox.Show(iter.GetInt());//輸出1
Interface1 iter = c2;
MessageBox.Show(iter.GetInt());//輸出4 --------會調用顯示方法,如果沒有顯示實現則會調用隱式實現方法。
MessageBox.Show(c2.GetInt());//輸出2//輸出2和4實現了1和4實現了多態,輸出2和4實現動態隱藏
/*模式二:*/
從新寫cl1類
class cl1 :Interface1
{
public virtual int GetInt()//隱式實現
{
return 1;
}
int Interface1.GetInt()//顯示實現
{
return 3;
}
}
class cc : cl1
{
public override int GetInt()
{
return 5;
}
}
class cd : cl1
{
public override int GetInt()
{
return 6;
}
}
cl1 c1 = new cl1();
Interface1 iter = c1;
//動態隱藏
MessageBox.Show(iter.GetInt());//輸出3 ---顯示實現
MessageBox.Show(c1.GetInt());//輸出1--------顯示實現
cc cc1= new cc();
cd cd1 = new cd();
//多態
c1 = cc1;
MessageBox.Show(c1.GetInt());//輸出5
c2= cd1;
MessageBox.Show(c1.GetInt());//輸出6
所以運用接口就可以輕松地解決多態和動態隱藏的統一問題了。
二、實現多繼承問題
實現多繼承也是接口在C#中很獨特和很重要的功能之一,
唉,這部分明天再另寫一篇博客吧,以上內容只是個人理解還有不對的地方請讀者幫忙指出,YYC再此感謝了。。。
待續。。。。。