(原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员
10.3? 接口的實(shí)現(xiàn)
在繼續(xù)前,先討論一下如何定義和實(shí)現(xiàn)接口。第9章介紹了接口定義的方式與類(lèi)相似,使用的代碼如下:
interface IMyInterface {// Interface members. }
接口成員的定義與類(lèi)成員的定義相似,但有幾個(gè)重要的區(qū)別:
不允許使用訪問(wèn)修飾符(public、private、protected或internal),所有的接口成員都是公共的。?
???? 接口成員不能包含代碼體。
?? 接口不能定義字段成員。
接口成員不能用關(guān)鍵字static、virtual、abstract或sealed來(lái)定義。
類(lèi)型定義成員是禁止的。
但要隱藏繼承了基接口的成員,可以用關(guān)鍵字new來(lái)定義它們,例如:
interface IMyBaseInterface {void DoSomething(); }interface IMyDerivedInterface : IMyBaseInterface {new void DoSomething(); }
其執(zhí)行方式與隱藏繼承的類(lèi)成員的方式一樣。
在接口中定義的屬性可以定義訪問(wèn)塊 get 和 set 中的哪一個(gè)能用于該屬性(或?qū)⑺鼈兺瑫r(shí)用于該屬性),例如:
interface IMyInterface {int MyInt( get; set; ) }
其中int屬性MyInt有g(shù)et和set存取器。對(duì)于訪問(wèn)級(jí)別有更嚴(yán)限制的屬性來(lái)說(shuō),可以省略它們中的任一個(gè)。
note : 這個(gè)語(yǔ)法類(lèi)似于自動(dòng)屬性,但自動(dòng)屬性是為類(lèi)(而不是接口)定義的,自動(dòng)屬性必須包含get和set存取器。
接口沒(méi)有指定應(yīng)如何存儲(chǔ)屬性數(shù)據(jù)。接口不能指定字段,例如用于存儲(chǔ)屬性數(shù)據(jù)的字段。最后,接口與類(lèi)一樣,可以定義為類(lèi)的成員(但不能定義為其他接口的成員,因?yàn)榻涌诓荒馨?lèi)型定義)。
?
在類(lèi)中實(shí)現(xiàn)接口
現(xiàn)接口的類(lèi)必須包含該接口所有成員的實(shí)現(xiàn)代碼,且必須匹配指定的簽名(包括匹配指定的get和set塊),并且必須是公共的。例如:
public interface IMyInterface {void DoSomething();void DoSomethingElse(); }public class MyClass : IMyInterface {public void DoSomething() {}public void DoSomethingElse() {} }
可以使用關(guān)鍵字 virtual 或 abstract 來(lái)實(shí)現(xiàn)接口成員,但不能使用 static 或 const。還可以在基類(lèi)上實(shí)現(xiàn)接口成員,例如:
public interface IMyInterface {void DoSomething();void DoSomethingElse(); }public class MyBaseClass { // 注意這里的基類(lèi)并沒(méi)有繼承接口public void DoSomething() {} }public class MyDerivedClass : MyBaseClass, IMyInterface {// DoSometing()接口在基類(lèi)中實(shí)現(xiàn)public void DoSomethingElse() {} }
繼承一個(gè)實(shí)現(xiàn)給定接口的基類(lèi),就意味著派生類(lèi)隱式地支持這個(gè)接口,例如:
public interface IMyInterface {void DoSomething();void DoSomethingElse(); }public class MyBaseClass : IMyInterface {public virtual void DoSomething() {}public virtual void DoSomethingElse() {} }public class MyDerivedClass : MyBaseClass {public override void DoSomething() {} }
顯然,在基類(lèi)中把實(shí)現(xiàn)代碼定義為虛擬,派生類(lèi)就可以替換該實(shí)現(xiàn)代碼,而不是隱藏它們。如果要使用new關(guān)鍵字隱藏一個(gè)基類(lèi)成員,而不是重寫(xiě)它,則方法IMyInterface.DoSomething()就總是引用基類(lèi)版本,即使通過(guò)這個(gè)接口來(lái)訪問(wèn)派生類(lèi),也是這樣。
?
1. 顯示實(shí)現(xiàn)接口成員
也可以由類(lèi)顯式地實(shí)現(xiàn)接口成員。如果這么做,該成員就只能通過(guò)接口來(lái)訪問(wèn),不能通過(guò)類(lèi)來(lái)訪問(wèn)。上一節(jié)的代碼中使用的隱式成員可以通過(guò)類(lèi)和接口來(lái)訪問(wèn)。
例如,如果類(lèi)MyClass隱式地實(shí)現(xiàn)接口IMyInterface的方法DoSomething(),如上所述,則下面的代碼就是有效的:
MyClass myObj = new MyClass(); myObj.DoSomething();
下面的代碼也是有效的:
MyClass myObj = new MyClass(); IMyInterface myInt = myObj; myInt.DoSomething();
另外,如果MyDerivedClass顯式實(shí)現(xiàn)DoSomething(),就只能使用后一種技術(shù)(只能用接口訪問(wèn))。其代碼如下:
public class MyClass : IMyInterface {void IMyInterface.DoSomething() { // 顯示實(shí)現(xiàn) }public void DoSomethingElse() {} }
其中 DoSomething()是顯式實(shí)現(xiàn)的,而 DoSomethingElse()是隱式實(shí)現(xiàn)的。只有后者可以直接通過(guò)MyClass的對(duì)象實(shí)例來(lái)訪問(wèn)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wodehao0808/p/4961494.html
總結(jié)
以上是生活随笔為你收集整理的(原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mybatis 使用resultMap实
- 下一篇: 转 小辉_Ray CORS(跨域资源共