using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace AppTest
{
class Demo_interface
{
static void Main(string[] args)
{
//使用(注意,這里是使用接口 IPrint,下面是不同的實例,獲得不同功能)
IPrint I;
I = new A(); //實例化 A,將打印出 A
I.Print();
I = new B(); //實例化 B,將打印出 B
I.Print();
Thread.Sleep(3 * 1000); //暫停3秒,看打印結果
}
}
//定義接口,定義后不需要改變,需要不同功能,繼承時擴展即可
interface IPrint
{
//接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;
//支持多繼承;可以用於支持回調;可以作用於值類型和引用類型;C#中不能包含任何靜態成員
//不能被直接實例化,可以通過繼承實現其抽象方法。
void Print();//只定義,不實現
//IPerson(); //錯誤
//string name; //錯誤
//public void GetIDcard(); //錯誤
//void GetName(); //正確
//void GetAge(string s); //正確
//int GetHeight(); //正確
}
//A 繼承接口
class A : IPrint
{
//實現接口方法,必須有,
//當然還可以再添加其它的字段、屬性、方法
public void Print()
{
System.Console.WriteLine("A");
}
}
//B 繼承接口
class B : IPrint
{
public void Print()
{
System.Console.WriteLine("B");
}
}
}
//在這個例子中,IPrint 接口中定義了Print方法,但沒有實現方法體.
//類A和類B都繼承了IPrint接口,並且實現了不同的Print方法.
//在Main 中調用A\B,獲得不同的打印結果
=====================================
寫的不錯,不過這個例子還缺少一部分,人家可以說我可以在基類上定義Print(),PrintPreview() 2個虛函數,讓后續不同打印機的類繼承這個基類,override 虛函數,然后通過基類指針一樣可以實現這個功能。
如果你這么說,如果要給HP打印機和IBM打印機增加一個新功能如Scan(),如果用基類虛函數就得重新修改基類,基類修改會影響到所有繼承他的類,系統成型后修改基類是非常危險的,而用接口只需讓HP的,IBM的打印類再繼承一個IScan接口就行了,不會影響到其他類,這就是接口優越於虛函數的地方。
五大面向對象設計原則
單一職責原則
2. 開放封閉原則
3. 里氏替換原則
定義:如果對於類型S的每一個對象o1,都有一個類型T的對象o2,使對於任意用類型T定義的程序P,
將o2替換為o1,P的行為保持不變,則稱S為T的一個子類型。
4. 依賴倒置原則
5. 接口隔離原則