什么是框架的接口
概述: 接口,對於大家都不陌生,至於何時使用,怎么使用?這里舉一個例子:假如一個類A,負責傳輸數據。而類B,恰好是接收數據。我們還需要一個類C用來接收和傳輸數據。那么怎么樣讓A類和B類繼承C呢?有的編程語言,允許多繼承。子類可以繼承多個父類。但是在C#中,定義不能多繼承,但是可以使用多個接口。那么要繼承接口就需要interface定義它ID,內部可以封裝方法,但是注意,倘若你要繼承ID接口,那么接口內部的所有方法屬性都要實現。說到此處,不免有人問:“接口和父類繼承有何區別?”.一般是泛類中的個體,即is--a的關系使用繼承。如:狗是動物的一種可以使用,Class 狗:動物而接口強調是對象具有某種能力,即can--do的關系使用接口。如:大雁會飛,Class 大雁:I飛C#定義子類不許繼承多個類,但是可以多個接口。如:唐老鴨是動物,它會說話,會游泳,Class 唐老鴨:動物,I說話,I游泳
C#基礎系列導航
- C#實現隊列讀寫操作(一)
- 變化多端的列表(二)
- VS自動內存管理(垃圾回收集)(三)
- C#忽略基礎知識點梳理(四)
- 什么是框架的接口(五)
- 程序集的加載與反射(六)
- CLR寄宿和應用程序域(七)
- 異常(八)
類和接口繼承問題:
System.Object類是所有類的根類,它定義的四個方法:ToString,Equals,CetHashCode,GetType適用於任何類。所有繼承Object類的類實際繼承的是方法簽名base()和具體實現。
接口:實際上是為一組方法簽名,指定一個方法名,不加以方法的實現。可以被多個類來繼承,可以定義事件,方法,參數/無參屬性。不許定義構造器方法和實例字段。提供接口必須實行所有接口中的方法。具有can--do的關系。
CLR要求接口方法標記Virtual。這樣才能被派生類重寫。如果不標記,默認Virtual和Sealed,阻止派生類重寫方法接口。
接口方法隱式和顯示實現:實例解析
接口:
internal sealed class SimpleType : IDisposable { //接口方法的隱式實現
public void Dispose() { Console.WriteLine("隱式 Dispoable"); } //接口方法的顯式實現
void IDisposable.Dispose() { Console.WriteLine("顯式 Dispoable"); } }
實現:
static void Main(string[] args) { SimpleType st = new SimpleType(); st.Dispose(); IDisposable d = st; d.Dispose(); Console.ReadLine(); }
結果:
泛型接口問題:
IComparable<T>有一下幾個好處:
1,編譯時安全,可以有任意類型,若有異常通過Object類拋出。
2,操作值類型時候,不需要太多裝箱,也正是比非泛型接口優化之處。性能提高。
3,可以根據參數T不同使用同一個接口若干次。代碼冗雜性小,可讀性高。性能提升。
對基類和接口操作的實例運用:
描述:有一個動物類,它可以派生出多個類。並且其中一個類既要實現繼承又要實現接口。在控制台程序編寫並輸出此派生類的所有方法。
基類派生多個類,並且其中一類繼承接口
//基類
public abstract class Base
{
public abstract void Animal();
}
//派生類,繼承基類和接口
public class Brid:Base,Interface1
{
public override void Animal()
{
Console.WriteLine("我是大雁!");
}
public void Fly()
{
Console.WriteLine("我會飛!");
}
public void Say()
{
Console.WriteLine("我會說話!");
}
}
//派生類
public class Brid1 : Base
{
public override void Animal()
{
Console.WriteLine("我是笨笨鳥!");
}
}
接口的定義
interface Interface1
{
void Fly();
void Say();
}
客戶端調用:
static void Main(string[] args)
{
Brid b1 = new Brid();
b1.Animal();
Interface1 d = b1;
d.Fly();
d.Say();
Console.ReadKey();
}
輸出結果
補充:抽象類和接口多態關系實例
之前對接口做了總結,應園友需求,今天總結一下接口和抽象類的基礎知識,用小的例子演示更容易理解。在演示之前我們還是把原理核心的區別了解下
相同點:
接口和抽象類都可以由子類繼承的抽象成員(就是可以聲明定義方法等但是不負責具體實現),接口和抽象類都不能實例化。
不同點:
接口所擁有的成員都是抽象成員,而抽象類既可以有抽象成員也可以有非抽象成員。(下面例子中,抽象類定義抽象方法和一般非抽象方法演示)
抽象類可以public和internal,但是接口一般都是public的
抽象類包含構造函數,析構函數,靜態成員和常量,恰恰接口不能包含這些。
類或者抽象類只能單繼承,接口可以多繼承
下面描述實例的思想流程:
什么是抽象類呢?我開始想到對象是動物,后來發現動物實例大家比較熟悉。就改變門門對象即抽象類。抽象類里面有什么?我想有個抽象方法,這個跟接口一樣。就在找個不一樣的構造方法,還要一個抽象屬性。抽象類完成了。下面繼承的子類就應該是具體的了,門有很多種,我選擇木門。木門中擁有抽象屬性和方法的重載(就是具體屬性和方法實現)。
這時候門可能還有玻璃門,鐵門,金門等。這樣就可以多個子類(不同材料門)繼承父類(門),這就是傳說的多態。下面缺接口,什么接口?之前我就說是can--do關系。我定義一個鎖的接口,也可以有門鈴接口。我把門鈴放在鎖類吧。聽到門鈴去開鎖(開門)。這樣讓子類(各種材料門)繼承門和鎖。實現了子類繼承接口和父類。多個這樣類實現多態。
然后,客戶端實例化兩種方法。一種對子類實例(這樣實例接口時候可以將子類對象附給接口),也可以實例父類(new 子類)。
綜述:
就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(接口)也可以有門鈴(多實現)。
接口源碼:
public interface Isuo//I鎖
{
void MenLing();//門鈴
}
抽象類實現繼承和多態:
public abstract class 門
{
protected string name;
//抽象屬性
public abstract string Name
{
get;
}
//抽象方法
public abstract void Open();
//一般方法
public void Price()
{
Console.WriteLine("我的門,價格好高!");
}
}
//繼承和多態
public class 木門 : 門, Isuo
{
public 木門(string myname)
{
name = myname;
}
//重載抽象屬性
public override string Name
{
get { return name; }
}
//重載抽象方法
public override void Open()
{
Console.WriteLine(name + " 是最經濟在!");
}
//實現接口方法
public void MenLing()
{
Console.WriteLine("我是木門的門鈴!");
}
}
public class 鐵門 : 門, Isuo
{
public 鐵門(string myname)
{
name = myname;
}
//重載抽象屬性
public override string Name
{
get { return name; }
}
//重載抽象方法
public override void Open()
{
Console.WriteLine(name + " 是結實的!");
}
//實現接口方法
public void MenLing()
{
Console.WriteLine("我是鐵門的門鈴!");
}
}
客戶端實現
static void Main(string[] args)
{
木門 men = new 木門("木門");
men.Open();
men.Price();
門 men1 = new 木門("鐵門");
men1.Open();
men1.Price();
Isuo s = men;
s.MenLing();
Console.Read();
}
運行結果:
總結:
到此接口基本定義和方法已經結束,以及使用的定義。接口多是起着內部方法的作用,有不同於類。在編程中會給你帶來更多的便利和驚喜。