繼承和多型

2022-04-11 03:32:11 字數 2590 閱讀 7268



sealed關鍵字

如果我們將類標記為sealed,編譯器將不會允許我們從這個型別派生。(c#結構總是隱式密封的。因此,我們永遠不可以從結構繼承結構,從類繼承結構或從結構繼承類。結構只能用於建模獨立的、使用者定義的資料型別。如果希望是is-a關係,就必須使用類。)

使用base關鍵字控制基類的建立

protected關鍵字

派生型別不再需要使用公共方法或屬性來間接訪問資料了。當然,可能的壞處在於:如果派生型別有權直接訪問其父類內部資料,有可能會偶爾繞過公共屬性內設定的既有業務規則。當定義受保護成員時,也就建立了一種父類和子類之間的信任級別,編譯器不會捕獲任何違背型別業務規則的異常。

包含/委託程式設計

class benefitpackage

}partial class employee

public benefitpackage benefits

set

}.......

}巢狀型別

public class outerclass

//私有巢狀型別只可以被包含類的成員使用

public class privateinnerclass

}巢狀型別的特徵:

通過巢狀型別可以完全控制內部型別的訪問級別,也就是可以宣告為私有的(回憶一下,非巢狀類不能使用private關鍵字來宣告)。

由於巢狀型別是包含類的成員,所以它可以訪問包含類的私有成員。

通常,巢狀型別只用做外部類的輔助方法,而不是外部世界所準備的。

//employee巢狀benefitpackage

public partial class employee

}public double computepaydeduction()

}在這種巢狀關係裡需要注意如何使用列舉:

employee.benefitpackage.benefitpackagelevel mybenefitlevel=employee.benefitpackage.benefitpackagelevel.platinum;

virtual和override關鍵字

多型為子類提供了一種方式,使其可以定義為由其基類定義的方法,這種過程叫做方法重寫。

partial class employee

......

}用virtual關鍵字標記的方法成為虛方法。

如果子類希望改變虛方法的實現細節,就必須使用override關鍵字。

class salesperson:employee

base.givebonus(amount*salesbonus);}}

class manager:employee

}密封虛成員

class salesperson:employee

}sealed class ptsalesperson:salesperson

// 編譯器錯誤!不能在ptsalesperson類中重寫這個方法,因為它是被密封的

public override void givebonus(float amount)

}抽象類

由於很多基類都是比較模糊的屍體,好的設計師會防止在**中直接建立新的employee物件。

abstract partial class employee

構建多型介面

成員投影

基類/派生類的轉換規則

as關鍵字

//我們不能強制轉換frank為hexagon,但編譯沒問題

hexagon hex=(hexagon)frank;

//使用「as」來測試相容性

hexagon hex2=frank as hexagon;

if(hex2==null)

console.writeline("sorry,frank is not a hexagon...");

is關鍵字

除了is關鍵字,c#語言還提供了is關鍵字來測試兩個項是否相容。然而,和as關鍵字不同的是,如果型別不相容,is關鍵字就返回false而不是null引用。

超級父類:system.object

system.object的核心成員

equals() 預設情況下,如果被比較的項指向記憶體中同乙個項,則方法會返回true。因此,equals()用於比較物件引用,而不是物件的狀態。一般情況下,這個方法被重寫為:如果被比較的物件有相同的內部狀態值(也就是基於值的語義),則返回true。要知道,如果重寫equals(),則還需要重寫gethashcode(),因為這些方法在內部用於hashtable型別從容器讀取子物件。valuetype類為所有結構重寫了該方法,它們進行的比較是基於值的。

finalize() 這個方法(在重寫後)在物件銷毀之前被呼叫來釋放所分配的資源。

gethashcode() 這個方法返回int來標識指定的物件例項。

tostring() 這個方法是用,格式(叫做完全限定名)返回物件的字串表示。這個方法可以被子類重寫來返回名稱/值對的標識字串以表示物件的內部狀態,而不是它的完全限定名。

gettype() 這個方法返回type物件,它完整描述當前指向的物件。簡而言之,這是所有物件都可用的執行時型別標識方法。

memberwiseclone() 這個方法的作用是逐個成員地返回當前物件的副本,通常用於轉殖物件。

繼承和多型

物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...

繼承和多型

物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...

繼承和多型

類還有乙個重要的特性就是繼承,什麼是繼承?它又有什麼作用呢?繼承最主要的目的就是為了擴充套件原類的功能,加強或改進原類所沒有定義的屬性及方法。例如我們有狗這個類,可是狗的種類還是有很多,比如說博美狗,聖伯納,柴犬等等,如果只用狗一種類來定義所有種類狗的屬性及方法,那麼用這個類所產生出來的物件一定會有...