C 成魔之路 3 C 物件導向高階技術 1

2021-07-10 07:23:05 字數 4506 閱讀 8732

c#中不支援多重繼承。為了避免傳統的多重繼承給程式帶來複雜性的問題,同時保證多重繼承給程式設計師帶來的好處,提出了介面的概念。

1、介面

(1)介面的概念以及宣告

介面提出了一種契約,讓使用介面的程式設計人員必須嚴格遵守介面提出的約定。強制性的要求實現子類,(即完全實現某個介面的派生類)必須實現介面約定的規範,從而保證子類必須擁有某些特性。

介面可以包含方法、屬性、索引器和事件作為成員,但是並不能設定這些成員的具體值,也就是說,只能定義,不能給他裡面定義的東西賦值。介面可以繼承其他介面,類可以通過其繼承的基類或介面多次繼承同乙個介面。

介面的特徵:

介面類似於抽象基類:繼承介面的任何非抽象型別必須實現介面中的所有成員。

不能夠直接例項化介面。

介面可以包含事件,索引器,方法和屬性。

類和結構可以從多個介面繼承。

介面自身可以從多個介面繼承。

語法:

宣告介面的時候,使用inte***ce關鍵字。

修飾符 inte***ce 介面名稱 :繼承的介面列表

(2)介面的實現以及多重繼承

介面的實現通過類繼承來實現,乙個類雖然只能夠繼承乙個基類,但是可以繼承任意介面。宣告實現介面的類時,需要在基類列表中包含類所實現介面的名稱。

示例程式:說明介面的建立和使用

namespace inte***ce

string studentname

void showinfoofstudent();

}class program : istudent

set}

public

string studentname

set}

public

void

showinfoofstudent()

static

void main(string args)//應用程式主程式

}}

注意:介面可以多重繼承,繼承的時候用『,』分隔。

示例程式:多繼承例項:

namespace inte***ce2

string ***

}inte***ce iteacher : ipeaple

inte***ce istudent : ipeaple

class program : iteacher , istudent

set}

public

string ***

set}

public

void

teach()

public

void

study()

static

void main(string args)

}}

注意:在派生類當中,繼承下來的***讀寫介面和派生類中的成員***必須保持不一致,否則會導致錯誤。一般使用成員開頭大寫來表示讀寫。具體參考:成神之路

(3)顯式介面成員顯示

如果類實現兩個介面,並且這兩個介面包含具有相同簽名的成員,那麼在類中實現該成員,將會導致兩個介面都使用該成員作為他們的實現。然而,如果兩個介面成員實現不同的功能。那麼這可能會導致其中乙個介面的實現不正確或者兩個介面的實現都不正確。這時可以顯式的實現介面成員,即建立乙個僅僅透過該介面呼叫並且特定於該介面的類成員。顯式介面成員實現是使用介面名稱和乙個句點命名該類成員來實現的。

示例程式:宣告兩個介面,兩個介面生命了乙個同名方法,然後定義乙個類,繼承這兩個介面。

namespace

inte***ce3

inte***ce

icalculate2

class

compute : icalculate1, icalculate2

int icalculate2.add()

}class

program

}}

注意:顯式介面成員實現中不能包含訪問修飾符,abstract,virtual,override或static修飾符。

2、抽象類和抽象方法

如果乙個類不與具體的事物聯絡,而只是表達一種抽象的概念或行為,僅僅是作為其派生類的乙個基類,這樣的類就可以宣告為抽象類,在抽象類中宣告方法時,如果加上abstract關鍵字,則為抽象方法。

c#中規定只要有乙個方法宣告為抽象方法,這個類也必須宣告為抽象類。

(和c++一樣)

(1)抽象類概述

抽象類主要用來提供多個派生類可以共享的基類的公共定義,它與非抽象類的主要區別:

抽象類不能直接例項化。

抽象類不能被密封。

抽象類中可以包含抽象成員,但是非抽象類中不可以。

語法:c#中宣告抽象類的時候需要使用abstract關鍵字,具體格式:

訪問修飾符 abstract

class 類名 : 基類或者介面

注意:宣告抽象類的時候,除了abstract關鍵字,class關鍵字和類名外,其他都是可選的。

(2)抽象方法概述和宣告

抽象方法就是在宣告方法的時候加上abstract關鍵字,宣告抽象方法的時候需要注意:

抽象方法必須宣告在抽象類中。

宣告抽象方法時,不能使用virtual、static 和private修飾符。

抽象方法宣告引入了乙個新方法,但是不提供該方法的實現,由於抽象方法不提供任何世紀實現,因此抽象方法的方法體只包含乙個分號。

當從抽象類派生乙個非抽象類的時候,需要在非抽象類中重寫抽象方法,以提供具體的實現。重寫抽象方法時需要使用override關鍵字。

示例程式:關於抽象類和抽象方法的使用:

namespace @abstract

set}

public

string name

set}

public

abstract

void

showinfoofemployee();

//抽象方法,用來輸出資訊。

}public

class mremployee : employee

}class program

}}

(3)抽象類和介面

抽象類和介面都包含可以由派生類繼承的成員,他們都不能直接例項化。但是可以宣告他們的變數。如果這樣做,就可以使用多型性把繼承這兩種型別的物件指定給他們的變數。接著通過這些變數來使用這些型別的成員,但是不能直接訪問派生類中的其他成員。

抽象類和介面的區別:

他們的派生類只能繼承乙個基類,即只能直接繼承乙個抽象類,但是可以繼承任意多個介面。

抽象類中可以定義成員的實現。但是介面中不可以。

抽象類中可以包含字段,建構函式,析構函式,靜態成員或者常量等,介面中不可以。

抽象類中的成員可以是私有的(只要不是抽象的)、受保護的、內部的或受保護的內部成員(受保護的內部成員只能在應用程式的**或派生類中訪問),但是介面中的成員必須是公共的。

3、密封類和密封方法

如果所有的類都可以被繼承,那麼很容易導致繼承的濫用,進而使類的層次結構體系變得十分複雜。避免濫用繼承,c#中提出了密封類的概念。

(1)密封類概述

密封類可以用來限制擴充套件性,如果密封了某個類,則其他類不能從該類繼承;如果密封了某個成員,則派生類不能夠重寫該成員的實現。預設情況下,不應該密封型別和成員。密封可以防止對庫的型別和成員進行自定義,但是也會影響開發人員對可用性的認識。

密封類的語法:

訪問修飾符 sealed

class 類名:基類或者介面

(2)密封方法概述

並不是每個方法都可以宣告為密封方法,密封方法只能夠用於對基類的虛方法進行實現,並提供具體的實現,所以,宣告密封方法時。sealed修飾符總是和override修飾符同時使用。

示例程式:

public

class basetest

public

sealed

class derivetest : basetest//派生乙個密封的子類

}}

(3)密封類和密封方法的使用

密封類除了不能被繼承之外,與非密封類的用法大致相同。而密封方法則必須通過重寫基類中的虛方法來實現。

示例程式:密封類和方法的實際運用:

namespace sealedtest

}public

sealed

class student : peaple

set}

public

string name

set}

public

sealed

override

void

showinfoofpeaple()

}class program

}}

C 成魔之路 4 C 物件導向高階技術 2

1 迭代器 使用foreach語句遍歷陣列或者集合時,該語句可以逐一列舉出集合或者陣列中的元素,這正是迭代器的功能體現。迭代器概念 迭代器是可以返回相同型別的值的有序序列的一段 可以用作方法 運算子或者get訪問器的 體。迭代器 使用yield return語句依次返回每個元素,yield brea...

C 物件導向(高階)

1.構造 委託 乙個建構函式可以呼叫另外的建構函式 class aa int i a i,0 a int i,int j 注 避免遞迴呼叫 例 class aa int i a i,0 a int i,int j a 2.不可變物件和類 immutable object and class 不可變物...

C 物件導向高階程式設計 筆記

最近重新複習了一下c 物件導向高階程式設計中知識點,學而時習之,不亦說乎。拷貝建構函式,拷貝的是同型別的物件 賦值建構函式 檢測自我賦值 為什麼?有什麼作用?if this str return this 組合繼承 委託示例 委託 繼承 composite pimpl 編譯防火牆 左邊永遠不用編譯,...