接口使用interface關鍵字進行定義,例如
interface IComparable
{
int CompareTo(object obj);
}
接口描述可屬于任何類或結構的一組相關行為。接口可由方法,屬性,事件,索引器或這4種成員類型的任何組合構成。接口不能包含字段,接口成員一定是公共的。類和結構可以像類繼承基類或結構一樣從接口繼承,但有兩個例外:
(1)類或結構課繼承多個接口
(2)當類或結構繼承接口時,它繼承成員定義,但不繼承實現
接口在面向對象編程中起著非常重要的作用,是我們后面要用到的工廠,多層架構等的重要組成部分。下面通過一個小的例子來看接口所帶來的方便
預先定義一個接口為小狗
public interface IDog
{
void Bark();
}
然后定義一個類MyDog來實現接口IDog,要注意的是,在類中必須要實現接口的方法,即使方法內是空的也必須要寫上。
public class MyDog:IDog
{
public void Bark()
{
Console.WriteLine("wang,wang");
}
}
如果你的小狗某天會飛了,就成了
public class MyDog:IDog
{
public void Bark()
{
Console.WriteLine("wang,wang");
}
public void Fly()
{
Console.WriteLine("Flying now");
}
}
一般的情況下我們不去擴張原來的接口IDog,可以看出,把Fly方法放入IDog是不合理的(不是所有的小狗都會飛)。這時應該定義新接口給Fly方法
public interface IFlyable
{
void Fly();
}
然后MyDog的實現應該如下:
public class MyDog:IDog,IFlyable
{
public void Bark()
{
Console.WriteLine("wang,wang");
}
public void Fly()
{
Console.WriteLine("Flying now");
}
}
這樣的好處是什么呢?比如在某個地方用到MyDog,如MyHoouse.直接放入MyDog會怎么樣?
public class MyHouse
{
MyDog mydog=null;
public MyHouse(MyDog dog)
{
mydog=dog;
}
//有人進來,狗叫
public void ComeIn()
{
mydog.Bark();
}
//拍電影,狗飛
public void ShootMovie()
{
mydog.Fly();
}
}
但有一天需求改變了(軟件里面需求改變是正確的),要求換你的狗而不是我的狗
public class YourDog:IDog,IFlyable
{
public void Bark()
{
Console.WriteLine("wang,wang");
}
public void fly()
{
Console.WriteLine("Flying now");
}
}
MyHouse怎么辦?重新實現一遍?原來的MyHouse其實還有一個壞處是“與MyDog是緊密耦合的”。當代軟件不夠靈活的地方就在于緊耦合,而接口正是解決這種情況的靈丹妙藥。所以一開始就不應該讓MyHouse和MyDog緊密耦合,而應該對接口進行編程,代碼如下
public void MyHouse
{
IDog _dog=null;
IFlyable _flyer=null;
public MyHouse(IDog dog,IFlyable flyer)
{
_dog=dog;
_flyer=flyer;
}
//有人進來,狗叫
public void ComeIn()
{
_dog.Bark();
}
//拍電影
public void ShootMovie()
{
_flyer.Fly();
}
}
這樣無論是傳MyDog或YourDog都可以,例如:
MyHouse house=new MyHouse (new MyDog(),new MyDog());
MyHouse house=new MyHouse(new YourDog(),new YourDog());
甚至還可以讓MyDog在ComeIn里面叫喚,讓YourDog在ShootMovie里面拍電影
例如:
MyHouse house=new MyHouse(new MyDog(),new YourDog());
新聞熱點
疑難解答