C 繼承相關知識

2021-08-21 05:17:34 字數 4178 閱讀 7152

在物件導向的程式設計中,有兩種截然不同繼承型別:實現繼承和介面繼承

1.實現繼承和介面繼承

*實現繼承:表示乙個型別派生於基型別,它擁有該基型別的所有成員欄位和函式。在實現繼承中,派生型別採用基型別的每個函式的實現**,除非在派生型別的定義中指定某個函式的實現**。在需要給現有的型別新增功能,或許多相關的型別共享一組重要的公共功能時,可以使用這種型別的繼承。

*介面繼承:表示乙個型別只繼承了函式的簽名,沒有繼承任何的**。在需要指定該型別具有某些可用的特性時,最好使用這種型別的繼承。

2.多重繼承

c#不支援多重繼承,但c#允許型別派生自多個介面————多重介面繼承。這說明,c#類可以派生自另乙個類和任意多個介面。更準確的說,因為system.object是乙個公共的基類,所以每個c#(除object之外)都有乙個基類,還可以有任意多個介面。

3.結構的繼承

使用結構的乙個限制是結構不支援實現繼承,但每個結構都自動派生自system.valuetype。不能編碼實現型別層次的結構,但結構可以實現介面。

語法:

class mydreved:baseclass

如果類或結構也派生自介面,則用逗號分隔列表中的基類和介面:

class mydreved:baseclass,iintenface1,iintenface2

}也可以把屬性宣告為virtual。對於虛屬性或重寫屬性,語法與非虛屬性相同,但要在定義中新增virtual關鍵字:

public virtual string name

c#中虛函式的概念與標準oop的概念相同:可以在派生類中重寫虛函式。在呼叫方法時,會呼叫該派生類的合適方法。在c#中,函式預設情況下不是虛的,但(除了建構函式)可以顯式的宣告為virtual。

在派生類中重寫乙個函式時,要使用override關鍵字顯示宣告:

class mydreved: baseclass

}

成員欄位和靜態函式都不能宣告為virtual,因為這個概念只對類中的例項函式成員有意義。

2.隱藏方法

如果簽名相同的方法在基類和派生類中都進行了宣告,但該方法沒有分別宣告為virtual和override,派生類方法就會隱藏基類方法。

classa  

}class

b:a}

class client

}

/*輸出

class is a

class is b

*/在大多數情況下,是要重寫方法,而不是隱藏方法,因為隱藏方法會造成對於給定類的例項呼叫錯誤的方法。但是,c#語法會在編譯時收到這個潛在錯誤的警告。

在c#中,要隱藏乙個方法應使用new 關鍵字宣告,這樣在編譯時就不會發出警告:

class a 

}class b:a

}

3.呼叫函式的基類版本

c#可以從派生類中呼叫方法的基本版本:base.()

class mydreved: baseclass

}

可以使用base.()語法呼叫基類中的任何方法,不必從同一方法的過載中呼叫它。

4.抽象類和抽象函式

c#允許把類和函式宣告為abstract.抽象類不能例項化,而抽象不能直接實現,必須在非抽象的派生類中重寫。顯然抽象函式也是虛擬的(儘管不需要提供virtual,實際上,也不能提供該關鍵字)。

如果類包含抽象函式,則該類也是抽象的,也必須宣告為抽象的:

abstract class building

抽象類中不能宣告非抽象方法,但可以宣告其它的非抽象成員。

5.密封類和密封方法

c#允許把類和方法宣告為sealed。對於類,這表示不能繼承該類;對於方法,表示不能重寫該方法。

sealed class

aclass

b:a //報錯

如果基類上不希望有重寫的方法和屬性,就不要把它宣告為virtual.

6.派生類的建構函式

假定沒有為任何類定義任何顯示的建構函式,編譯器就會為所有的類提供預設的初始化建構函式,在後台編譯器可以很好的解決類的層次結構中的問題,每個類中的每個欄位都會初始化為對應的預設值。

在建立派生類的例項時,實際上會有多個建構函式起作用。要例項化的類的建構函式本身不能初始化類,還必須呼叫基類中的建構函式。

建構函式的呼叫順序是先呼叫object,在按照層次結構呼叫基類的建構函式,由基類到父類,直到到達要例項化的類為止。在這個過程中,每個建構函式都初始化它自己的類中的字段。因為最先呼叫的總是基類的建構函式,所以派生類在執行過程中可以訪問任何基類的成員,因為基類已經構造出來了,其字段也初始化了。

*在層次結構中新增無引數的建構函式

在層次結構中新增乙個無引數的建構函式會替換預設的建構函式,所以在執行過程中,會預設呼叫基類中新增的無引數的建構函式。其它方面不變。

*在層次結構中新增帶引數的建構函式

在層次結構中要呼叫這個帶引數的建構函式,需要在父類的建構函式中顯示呼叫:

public

abstract

class genericcustomer

public

genericcustomer(string name)

public

string name

set

}}public

class nevermore60customer : genericcustomer

public

nevermore60customer(string name, string referrername) : base(name)

public

string referrername

set

}}

修飾符可以指定方法的可見性:如public或private,還可以指定一項的本質,如方法是virtual或abstract.

1.可見性修飾符

修飾符            應用於                    說明

public            所有類和成員                任何**可以訪問

protected       類的成員和內嵌類              只有在類內部和派生類中訪問

internal        所有類和成員                只有在類內部和包含它的程式集中訪問

private          類的成員和內嵌類              只有在類內部訪問

protected internal    類的成員和內嵌類              只有在類內部,派生類中和包含它的程式集中訪問

不能把類定義為protected,private,protected internal,因為這些修飾符對於包含在命名空間中的型別沒有意義。因此這些修飾符只能應用於成員。但是可以用這些修飾符定義巢狀的類(內嵌類,包含在其它類中的類),因為在這種情況下,類也具有成員的狀態:

public class outerclass }

2.其它修飾符

修飾符      應用於       說明

new      函式        隱藏函式

static      所有成員      靜態

virtual     函式        成員可以由派生類重寫

abstract    類,函式      抽象

override    函式        重寫虛擬和抽象的成員

sealed     類,方法,屬性 不能繼承和重寫

extern    僅靜態方法     成員在外部用另一種語言實現

public inte***ce idisposable

宣告介面在語法上和宣告抽象類完全相同,但不允許提供任何成員的實現方式。抽象類可以提供除方法之外的其它成員的實現方式,比如屬性。

一般情況下,介面只能包含方法,屬性,索引器和事件的宣告。

不能例項化介面,介面即不能有建構函式,也不能有欄位。介面定義也不允許包含運算子過載。

在介面中不允許宣告關於成員的修飾符。介面成員總是公有的,不能宣告為虛擬和靜態。如果需要,在實現的類中宣告。

實現介面的類必須實現介面的所有成員。

介面可以彼此繼承,其方式與類的繼承方式相同。

繼承相關知識

繼承的基本語法 class 子類 extends 父類 1.子類就會自動擁有父類定義的屬性和方法 2.父類又叫超類,基類 3.子類又叫派生類 繼承的注意事項與細節問題 1.子類繼承了父類所有的屬性和方法,但是私有屬性和方法不能在子類直接訪問,要通過父類公共方法區訪問 父類1 package com....

C 繼承相關知識點

c 作為物件導向的語言,類之間可以繼承,被繼承的類稱為基類 父類 產生的新類稱為派生類 子類 c 的類許可權分為三個等級,private 私有的 protect 被保護的 public 公有的 其相對應的繼承的許可權也分為相同的三個等級,即private,protect以及public繼承。這三類繼...

繼承的相關知識

定義 繼承是物件導向復用的重要手段,即物件導向的可重用性是通過 繼承 來實現的。解決在已有的類中增加新的特性,減少重複的工作量的問題。已經存在的類,叫 基類 或 父類 建立的新的類,叫 派生類 或 子類 繼承是型別之間的關係模型,共享公有的東西,實現類內各自不同的東西。繼承的定義格式為 class ...