這節講一下接口(interface) 。
接口是一種特殊的抽象類,它用來定義一組行為規范,不同於抽象類的是,接口只能定義方法,並且只能定義抽象方法。類用繼承來描述子類和父類之間的關系,而接口用實現來描述接口和類的關系。
interface IAnimal { void Shout (); }
接口有個約定俗成的命名規則,所有接口的首字母都是I,接口中的方法都必須是public,所以定義接口中的方法時可以省略此關鍵字。
接口本身的語法很簡單,但是接口在整個面向對象中的作用是舉足輕重的,一般接口作為服務的調用者,其子類作為服務的提供者,可以讓我們實現更松的耦合。跟接口有關的有一個很重要的原則:接口隔離原則(Interface Segregation Principle),它跟類的單一職責原則類似,它強調接口定義的方法,要從屬於同一類。
我們看一個不太恰當例子:
interface IDonaldDuck { void Say (); void Swim (); } class DonalDuck : IDonaldDuck { public void Say () { Console.WriteLine ("沒有小鴨子比我更懂說話。"); } public void Swim () { Console.WriteLine ("沒有小鴨子比我更懂游泳。"); } }
唐老鴨繼承了IDonalDuck接口,接口定義了說話和浮水這兩個方法,說話是人的特有的行為,浮水是鴨科動物等的行為,這兩種行為的從屬不一樣,所以根據接口隔離原則來說,我們不能將其放在一塊,而是應該像下面這樣:
interface IPreson { void Say (); } interface IDuck { void Swim (); } class DonalDuck : IPreson,IDuck { public void Say () { Console.WriteLine ("沒有小鴨子比我更懂說話。"); } public void Swim () { Console.WriteLine ("沒有小鴨子比我更懂游泳。"); } }
根據行為的從屬性質不同,划分合理的接口,但是要注意,我們在開發的時候,不要將接口分的過細,要取一個度,合適的遵循接口隔離原則。
另外,我們還可以顯示的實現接口,還是以上面的例子來說:
class DonalDuck : IPreson, IDuck { void IPreson.Say () { throw new NotImplementedException (); } void IDuck.Swim () { throw new NotImplementedException (); } }
在方法的名字前加上接口名,這樣,在實例化類的時候,我們只有在將類的實例賦給它的實現接口時,才能使用該類實現的該接口的方法。
直接實例,是無法看到實現的接口方法的。
我們需要顯示的賦給接口類才能看到對應的方法:
個人公眾號,熱愛分享,知識無價。