<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在物件導向的程式設計中,有兩種截然不同繼承型別:實現繼承和介面繼承
*實現繼承:表示一個型別派生於基本類型,它擁有該基本類型的所有成員欄位和函數。在實現繼承中,派生型別採用基本類型的每個函數的實現程式碼,除非在派生型別的定義中指定某個函數的實現程式碼。在需要給現有的型別新增功能,或許多相關的型別共用一組重要的公共功能時,可以使用這種型別的繼承。
*介面繼承:表示一個型別只繼承了函數的簽名,沒有繼承任何的程式碼。在需要指定該型別具有某些可用的特性時,最好使用這種型別的繼承。
C#不支援多重繼承,但C#允許型別派生自多個介面————多重介面繼承。這說明,C#類可以派生自另一個類和任意多個介面。更準確的說,因為System.Object是一個公共的基礎類別,所以每個C#(除Object之外)都有一個基礎類別,還可以有任意多個介面。
使用結構的一個限制是結構不支援實現繼承,但每個結構都自動派生自System.ValueType。不能編碼實現型別層次的結構,但結構可以實現介面。
語法:
class MyDreved:BaseClass { }
如果類或結構也派生自介面,則用逗號分隔列表中的基礎類別和介面:
class MyDreved:BaseClass,IIntenface1,IIntenface2 { }
如果在類定義中沒有指定基礎類別,C#編譯器就假定System.Object是基礎類別。
把一個基礎類別函數宣告為virtual,就可以在任何派生類中重寫(override)該函數:
class BaseClass { public virtual void VirtualMethod() { // } }
也可以把屬性宣告為virtual。對於虛屬性或重寫屬性,語法與非虛屬性相同,但要在定義中新增virtual關鍵字:
public virtual string Name { get;set; }
C#中虛擬函式的概念與標準OOP的概念相同:可以在派生類中重寫虛擬函式。在呼叫方法時,會呼叫該派生類的合適方法。在C#中,函數預設情況下不是虛的,但(除了建構函式)可以顯式的宣告為virtual。
在派生類中重寫一個函數時,要使用override關鍵字顯示宣告:
class MyDreved: BaseClass { public override void VirtualMethod() { // } }
成員欄位和靜態函數都不能宣告為virtual,因為這個概念只對類中的範例函數成員有意義。
如果簽名相同的方法在基礎類別和派生類中都進行了宣告,但該方法沒有分別宣告為virtual和override,派生類方法就會隱藏基礎類別方法。
class A { public void a() { Console.WriteLine('CLASS is A'); } } class B:A { public void a() { Console.WriteLine('CLASS is B'); } } class client { static void main() { B b=new B(); A a=b; a.a(); b.a(); } } /*輸出 CLASS IS A CLASS IS B */
在大多數情況下,是要重寫方法,而不是隱藏方法,因為隱藏方法會造成對於給定類的範例呼叫錯誤的方法。但是,C#語法會在編譯時收到這個潛在錯誤的警告。
在C#中,要隱藏一個方法應使用new 關鍵字宣告,這樣在編譯時就不會發出警告:
class A { public void a() { Console.WriteLine('CLASS is A'); } } class B:A { public new void a() { Console.WriteLine('CLASS is B'); } }
C#可以從派生類中呼叫方法的基本版本:base.<MethodName>()
class MyDreved: BaseClass { public override void VirtualMethod() { base.VirtualMethod(); } }
可以使用base.<MethodName>()語法呼叫基礎類別中的任何方法,不必從同一方法的過載中呼叫它。
C#允許把類和函數宣告為abstract.抽象類不能範例化,而抽象不能直接實現,必須在非抽象的派生類中重寫。顯然抽象函數也是虛擬的(儘管不需要提供virtual,實際上,也不能提供該關鍵字)。
如果類包含抽象函數,則該類也是抽象的,也必須宣告為抽象的:
abstract class Building { public abstract void Cal(); }
抽象類中不能宣告非抽象方法,但可以宣告其它的非抽象成員。
C#允許把類和方法宣告為sealed。對於類,這表示不能繼承該類;對於方法,表示不能重寫該方法。
sealed class A { } class B:A //報錯 { }
如果基礎類別上不希望有重寫的方法和屬性,就不要把它宣告為virtual.
假定沒有為任何類定義任何顯示的建構函式,編譯器就會為所有的類提供預設的初始化建構函式,在後臺編譯器可以很好的解決類的層次結構中的問題,每個類中的每個欄位都會初始化為對應的預設值。
在建立派生類的範例時,實際上會有多個建構函式起作用。要範例化的類別建構函式本身不能初始化類,還必須呼叫基礎類別中的建構函式。
建構函式的呼叫順序是先呼叫Object,在按照層次結構呼叫基礎類別的建構函式,由基礎類別到父類別,直到到達要範例化的類為止。在這個過程中,每個建構函式都初始化它自己的類中的欄位。因為最先呼叫的總是基礎類別的建構函式,所以派生類在執行過程中可以存取任何基礎類別的成員,因為基礎類別已經構造出來了,其欄位也初始化了。
public abstract class GenericCustomer { private string name; public GenericCustomer() { name = "<no name>"; } public GenericCustomer(string name) { this.name = name; } public string Name { get {return name;} set {name = value;} } } public class Nevermore60Customer : GenericCustomer { private string referrerName; private uint highCostMinutesUsed; ublic Nevermore60Customer(string name) : this(name, " <None>") { } public Nevermore60Customer(string name, string referrerName) : base(name) { this.referrerName = referrerName; } public string ReferrerName { get {return referrerName;} set {referrerName = value;} } }
修飾符可以指定方法的可見性:如public或private,還可以指定一項的本質,如方法是virtual或abstract.
修飾符 | 應用於 | 說明 |
---|---|---|
public | 所有類和成員 | 任何程式碼可以存取 |
protected | 類的成員和內嵌類 | 只有在類內部和派生類中存取 |
internal | 所有類和成員 | 只有在類內部和包含它的程式集中存取 |
private | 類的成員和內嵌類 | 只有在類內部存取 |
protected internal | 類的成員和內嵌類 | 只有在類內部,派生類中和包含它的程式集中存取 |
不能把類定義為protected,private,protected internal,因為這些修飾符對於包含在名稱空間中的型別沒有意義。因此這些修飾符只能應用於成員。但是可以用這些修飾符定義巢狀的類(內嵌類,包含在其它類中的類),因為在這種情況下,類也具有成員的狀態:
public class OuterClass { protected class InnerClass { } }
修飾符 | 應用於 | 說明 |
---|---|---|
new | 函數 | 隱藏函數 |
static | 所有成員 | 靜態 |
virtual | 函數 | 成員可以由派生類重寫 |
abstract | 類,函數 | 抽象 |
override | 函數 | 重寫虛擬和抽象的成員 |
sealed | 類,方法,屬性 | 不能繼承和重寫 |
extern | 僅靜態方法 | 成員在外部用另一種語言實現 |
public interface IDisposable { void Dispose(); }
宣告介面在語法上和宣告抽象類完全相同,但不允許提供任何成員的實現方式。抽象類可以提供除方法之外的其它成員的實現方式,比如屬性。
一般情況下,介面只能包含方法,屬性,索引器和事件的宣告。
不能範例化介面,介面即不能有建構函式,也不能有欄位。介面定義也不允許包含運運算元過載。
在介面中不允許宣告關於成員的修飾符。介面成員總是公有的,不能宣告為虛擬和靜態。如果需要,在實現的類中宣告。
實現介面的類必須實現介面的所有成員。
介面可以彼此繼承,其方式與類的繼承方式相同。
到此這篇關於C#之繼承實現的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45