基礎拾遺------特性詳解html
基礎拾遺------redis詳解redis
基礎拾遺------反射詳解數據結構
1.1.接口是一個引用類型,經過接口能夠實現多重繼承。
1.2.接口成員是自動公開的(public),且不能包含任何訪問修飾符(public、protected、internal、private),不然 編譯器會報錯。
1.3.接口相似於抽象基類,不能直接實例化接口;接口中的方法都是抽象方法,實現接口的任何非抽象類型都必須實現接口的全部成員:
當顯式實現該接口的成員時,實現的成員不能經過類實例訪問,只能經過接口實例訪問。
當隱式實現該接口的成員時,實現的成員能夠經過類實例訪問,也能夠經過接口實例訪問,可是實現的成員必須是公有的。
1.4.接口不能包含常量、字段、運算符、實例構造函數、析構函數或類型、不能包含靜態成員,只能包含方法、屬性、事件、索引等成員。
1.5.接口成員不能有static、abstract、override、virtual修飾符,使用new修飾符不會報錯,但會給出警告說不須要關鍵字new。
1.6.在聲明接口成員的時候,不許爲接口成員編寫具體的可執行代碼,也就是說,只要在對接口進行聲明時指明接口的成員名稱和參數就能夠了。
interface |
abstract class |
|
實例化 |
不能夠 |
不能夠 |
派生類實現 |
必須實現全部契約 |
實現沒實現的方法 |
繼承 |
接口支持多繼承 |
必須抽象類不能實現多繼承 |
抽象 |
接口只能定義抽象規則 |
抽象類既能夠定義規則,還可能提供已實現的成員。但不能使用new關鍵字,也不能被密封,緣由是抽象類不能被實例化 |
概念 |
接口是一組行爲規範 |
抽象類是一個不徹底的類 |
回調 |
接口能夠用於支持回調 |
抽象類不能實現回調,由於繼承不支持 |
成員 |
接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法 |
抽象類能夠定義字段、屬性、包含有實現的方法 |
數據類型 |
接口能夠做用於值類型和引用類型。例如,Struct就能夠繼承接口,而不能繼承類 |
抽象類只能做用於引用類型 |
構造方法 |
沒有構造方法 |
有構造方法 |
靜態方法 |
沒有靜態方法(默認public static final類型) |
包含靜態方法 |
修飾符 |
默認public沒有其餘修飾符。 |
能夠是public,protected |
2.2.1. 若是預計要建立組件的多個版本,則建立抽象類。抽象類提供簡單的方法來控制組件版本;
2.2.2.若是建立的功能將在大範圍的全異對象間使用,則使用接口。若是要設計小而簡練的功能塊,則使用接口;
2.2.3.若是要設計大的功能單元,則使用抽象類.若是要在組件的全部實現間提供通用的已實現功能,則使用抽象類;
2.2.4.抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。
3.1.接口使用 interface 關鍵字聲明,它與類的聲明相似。接口聲明默認是 public 的;
3.2.根據約定,接口類型名稱要以大寫字母I開頭;
public interface ITransactions { // 接口成員 void showTransaction(); double getAmount(); }
注:3.3.對CLR而言,定義接口就像定義類型,也就是說,CLR會爲接口類型對象定義一個內部數據結構,同時可用反射機制來查詢接口類型的功能。
3.4.爲何不能指定接口中方法的修飾符?
接口中的方法用來定義對象之間通訊的契約,指定接口中的方法爲私有或保護沒有意義。它們默認爲公有方法。
C#中的接口提供了一種實現運行時的多態。
using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceApplication { public interface ITransactions { // 接口成員 void showTransaction(); double getAmount(); } public class Transaction : ITransactions { private string tCode; private string date; private double amount; public Transaction() { tCode = " "; date = " "; amount = 0.0; } public Transaction(string c, string d, double a) { tCode = c; date = d; amount = a; } public double getAmount() { return amount; } public void showTransaction() { Console.WriteLine("Transaction: {0}", tCode); Console.WriteLine("Date: {0}", date); Console.WriteLine("Amount: {0}", getAmount()); } } class Tester { static void Main(string[] args) { Transaction t1 = new Transaction("001", "8/10/2012", 78900.00); Transaction t2 = new Transaction("002", "9/10/2012", 451900.00); t1.showTransaction(); t2.showTransaction(); Console.ReadKey(); } } }
當上面的代碼被編譯和執行時,它會產生下列結果:
Transaction: 001
Date: 8/10/2012
Amount: 78900
Transaction: 002
Date: 9/10/2012
Amount: 451900
4.2.1隱式實現
interface IAnimal { void Dog(); } class Animal:IAnimal { public void Dog() { //# } }
//經過類調用 Animal animal = new Animal(); animal.Dog(); //或者經過接口調用 IAnimal animal = new Animal(); animal.Dog();
以上:類與接口都能調用的爲隱式實現。
4.2.2.顯示實現
interface IAnimal { void Dog(); } class Animal:IAnimal { void IAnimal.Dog() { //# } }
IAnimal animal = new Animal(); animal.Dog();
Animal animal = new Animal(); (animal as IAnimal).Dog();
以上:用類的方法調用須要強制轉換的實現爲顯示實現。
是否是感受顯示實現多餘項目中也歷來未曾遇到過???
4.3.1.當類實現一個接口時,一般使用隱式接口實現,這樣能夠方便的訪問接口方法和類自身具備的方法和屬性。
4.3.2.當類實現多個接口時,而且接口中包含相同的方法簽名,此時使用顯式接口實現。即便沒有相同的方法簽名,仍推薦使用顯式接口,由於能夠標識出哪一個方法屬於哪一個接口。
4.3.3隱式接口實現,類和接口均可訪問接口中方法。顯式接口實現,只能經過接口訪問。
5.1.1.類繼承不只是說明繼承,並且也是實現繼承;而接口繼承只是說明繼承。
5.1.2.C#中類繼承只容許單繼承,可是接口繼承容許多繼承,一個子接口能夠有多個父接口(用","分割)。
interface IProgram { void Fun(); } interface IAProgram:IProgram { } class Program : IAProgram { void IProgram.Fun() { Console.WriteLine("I am IProgram Fun."); } staticvoid Main(string[] args) { Program pro =new Program(); ((IAProgram)pro).Fun(); Console.Read(); } }
經過接口,能夠指定組件必須實現的方法,但不實際指定如何實現方法。抽象類能夠建立行爲的定義,同時提供用於繼承類的一些公共實現。對於在組件中實現多態行爲,接口和抽象類都是頗有用的工具。
如今咱們把一個抽象類被容許把接口方法映射到抽象方法中:
interface ICompute { void Add(); void Subtract(); } abstract class Compute : ICompute { void ICompute.Add() { ComputeAdd(); } void ICompute.Subtract() { ComputeSubtract(); } protected abstract void ComputeAdd(); protected abstract void ComputeSubtract(); }
這裏,從Compute派生的非抽象類要覆蓋ComputeAdd和 ComputeSubtract, 所以提供了ICompute的實際實現程序。
很少說:基礎拾憶------泛型詳解