在物件導向的程式設計中,有兩種截然不同繼承型別:實現繼承和介面繼承
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 ...