程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 對C#中的接口的思考(一)

對C#中的接口的思考(一)

編輯:C#入門知識

思考一: C#中接口和抽象類的使用上的區別:

---------------YYC

1、抽象類不能被實例化,但能擁有自己的成員字段和非抽象的方法,但接口比抽象類更加抽象,其成員只能是
一般的方法、屬性和索引函數而不能擁有自己的成員字段和構造函數。
2、用abstract聲明的抽象類中的方法必須有訪問修飾符如public等關鍵字進行修飾,其次抽象類裡面的方
法須用abstract聲明為抽象方法或則用virtual聲明為虛擬方法(非抽象方法除外,虛擬方法有簡單執
行代碼,派生類中可以選擇不重載,抽象方法沒有任何執行代碼,派生類中必須重載)。在其派生類
中重載抽象方法或虛擬方法時時必須用override修飾。而在用interface聲明的接口類中的接口方法第
一不允許是靜態的,其次除了無執行代碼外
不能加任何訪問限制修飾符,且不能用virtual或abstract進行修飾。同時在直接支持其接口的類型中不能用
override修飾符來表示重載方法,且必須支持即實現該接口中的所有方法。但可以用new關鍵字來隱藏父接口中的方法。

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再此感謝了。。。

待續。。。。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved