介面的相關陳述1.一個介面定義了一個契約。2.介面可以包容方法、C#屬性、事件、以及索引器。3.在一個介面聲明中,我們可以聲明零個或者多個成員。4.所有介面成員的預設訪問類型都是public。5.如果在介面成員聲明中包括了任何修飾符,那麼會產生一個編譯器錯誤。6.與一個非抽象類別類似,一個抽象類別必須提供介面中所有成員的實現,只要這些成員在這個類的基類中出現過。
介面的理解1. 面向介面編程利用OO的一個基本性質——多態,相同方法不同表現。可以這樣想一下,client編寫自己程式的時候,如果直接面向一個具體類寫程式,那這個程式有個風吹草動的,那client就要受到影響,但如果面向一個介面就不同了,某個具體類變了,只知介面,不知具體類的client就可以完全不動。都說上層領導比較好當,因為可以乾的事通常對老百姓來說是虛的,越虛就越不容易錯。
這個道理在OO中也是適用的。2. 換個視角看,面向介面編程反映OO的另一個方面——封裝,介面將具體實現封裝了起來,可以不影響客戶的情況下切換實現3. 介面的作用,一言以蔽之,就是標誌類的類別(type of class)。把不同類型的類歸於不同的介面,可以更好的管理他們。OO的精髓,我以為,是對對象的抽象,最能體現這一點的就是介面。為什麼我們討論設計模式都只針對具備了抽象能力的語言(比如c++、java、c#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似調侃,實乃至理)。
假設我們公司有兩種程式員:VB程式員,指的是用VB寫程式的程式員,用clsVBProgramer這個類表示;Delphi程式員指的是用Delphi寫程式的程式員,用clsDelphiProgramer這個類來表示。 每個類都有一個WriteCode()方法。定義如下:
class clsVBProgramer()
{
....
WriteCode()
{
//用VB語言寫代碼;
}
....
}
class clsDelphiProgramer()
{
....
WriteCode()
{
//用Delphi語言寫代碼;
}
....
}
現在公司來了一個項目,要求派某個程式員寫一個程式。
class clsProject()
{
....
WritePrograme(clsVBProgramer programer)//用VB寫代碼
{
programer.WriteCode();
}
WritePrograme(clsDelphiProgramer programer)//重載方法,用Delphi寫代碼
{
programer.WriteCode();
}
......
}
在主程式中我們可以這樣寫:
main()
{
clsProject proj=new clsProject;
//如果需要用VB寫代碼
clsVBProgramer programer1=new clsVBProgramer;
proj.WritePrograme(programer1);
//如果需要用Delphi寫代碼
clsDelphiProgramer programer2=new clsDelphiProgramer;
proj.WritePrograme(programer2);
}
但是如果這時公司又來了一個C#程式員,我們怎麼改這段程式,使它能夠實現用C#寫程式的功能呢?我們需要增加一個新類clsCSharpProgramer,同時在此clsProject這個類中要再次重載WritePrograme(clsCSharpProgramer programer)方法。這下麻煩多了。如果還有C程式員,C++程式員,JAVA程式員呢。麻煩大了!
但是如果改用介面,就完全不一樣了:
首先聲明一個程式員介面:
interface IProgramer()
{
WriteCode();
}
然後聲明兩個類,並實現IProgramer介面:
class clsVBProgramer():IProgramer
{
....
WriteCode()
{
//用VB語言寫代碼;
}
....
}
class clsDelphiProgramer():IProgramer
{
....
WriteCode()
{
//用Delphi語言寫代碼;
}
....
}
對clsProject這個類進行一下修改:
class clsProject()
{
....
WritePrograme(IProgramer programer)
{
programer.WriteCode();//寫代碼
}
......
}
main()
{
clsProject proj=new clsProject;
IProgramer programer;
//如果需要用VB寫代碼
programer=new clsVBProgramer;
proj.WritePrograme(programer);
//如果需要用Delphi寫代碼
programer=new clsDelphiProgramer;
proj.WritePrograme(programer);
}
如果再有C#,C,C++,JAVA這樣的程式員添加進來的話,我們只需把它們相關的類加進來,然後在main()中稍做修改就OK了。擴充性特別好!
另外我們如果把clsProject這個類封成一個組件,那麼當我們的使用者需要要擴充功能的時候,我們只需要在外部做很小的修改就能實現,可以說根本就用不著改動我們已經封好組件!是不是很方便,很強大!