繼承是oop最重要的特性之一。 oop--物件導向
任何類都可以從另乙個類中繼承,這就是說,這個類擁有它繼承的類的所有成員。在oop中,被繼承(繼承也稱為派生)的類稱為父類(也稱為基類)。注意,c#中的物件僅能直接派生於乙個基類,當然基類也可以由自己的基類。
繼承性可以從乙個較一般的基類擴充套件或建立更多的特定類。例如,考慮乙個代表農場家畜的類。這個類叫做animal,擁有方法如eatfood()或breed(),我們可以建立乙個派生類cow,支援所有這些方法,它也有自己的方法,如moo()和supplymilk()。還可以建立另外乙個派生類chicken,該類有cluck()和layegg()方法。
在繼承乙個基類時,成員的可訪問性就成了乙個重要問題。派生類不能訪問基類的私有成員,但可以訪問其公共成員。不過,派生類和外部的**都可以訪問公共成員。這就是說,只使用這兩個可訪問性,不能讓乙個成員只讓基類和派生類訪問,而不能由外部**訪問。
為了解決這個問題,c#提供了第三種可訪問性protected,只有派生類才可以訪問protected成員。對外部**來說,這個可訪問性與私有成員一樣:外部**不能訪問private成員和protected成員。
除了定義成員的保護級別外,我們還可以為成員定義其繼承行為。基類的成員可以是virtual的,也就是說,成員可以由繼承它的類重寫。派生類可以提供成員的其他執行**。這種執行**不會刪除原來的**,仍可以在類中訪問原來的**,但是外部不能訪問它們。如果沒有提供其他執行方式,外部**就可以訪問基類中成員的執行**。
注意:虛擬成員不能是私有成員,因為這樣會自相矛盾——不能說成員可以由派生類重寫,同時派生類又不能訪問它。
在前面的家畜示例中,可以把eatfood變成虛擬成員,在派生類中為它提供新的執行**,例如為cow類提供新執行**,如下圖所示。
這裡顯示了animal和cow類的eatfood()方法,說明它們有自己的執行**。
基類還可以定義為抽象類,抽象類不能直接例項化。要使用抽象類,必須繼承這個類,抽象類可以有抽象成員,這些成員在基類中沒有指定**,這些執行**必須在派生類中提供。
如果animal是乙個抽象類,uml圖就會如下圖所示
注意:抽象類以斜體名稱顯示(有時它們的方框是虛線)
上圖中eatfood()和breed()都顯示在派生類chicken和cow中。
有兩種可能:
1.說明這些方法是抽象的(必須在派生類中重寫)
abstract2.說明這些方法是虛擬的(已緊在chicken和cow中重寫)class
animal
主體public
abstract
void
breed();
}class
cow : animal
public
void
supplymilk()
public
override
void
eadfood() //抽象方法在子類中必須實現
public
override
void
breed()
}class
chicken : animal
public
void
layegg()
public
override
void
eadfood()
public
override
void
breed()
}
abstract當然,抽象基類可以提供成員的實現**,這是很常見的。不能例項化抽象類,意味著不能再抽象類中封裝功能。class
animal
//虛擬方法,必須有{}實體
public
virtual
void
breed()
} class
cow : animal
public
void
supplymilk()
public
override
void
eadfood() //虛擬方法在子類中可以實現,也可以不實現
public
override
void
breed()
}class
chicken : animal
public
void
layegg()
public
override
void
eadfood()
public
override
void
breed()
}
最後,類可以是密封的sealed。密封的類不能用作基類,所以沒有派生類。
在c#中,所有的物件都有乙個共同的基類object(在.net framework中,其別名是system.object)。第9章中將詳細介紹這個類。
注意:如本章前面所述,介面也可以繼承自其他介面。與類不同的是,介面可以繼承多個基介面(以類可以支援多個介面的方式派生)
8 2 2繼承 第8章 物件導向程式設計簡介
繼承是oop最重要的特性之一。oop 物件導向 任何類都可以從另乙個類中繼承,這就是說,這個類擁有它繼承的類的所有成員。在oop中,被繼承 繼承也稱為派生 的類稱為父類 也稱為基類 注意,c 中的物件僅能直接派生於乙個基類,當然基類也可以由自己的基類。繼承性可以從乙個較一般的基類擴充套件或建立更多的...
第15章 物件導向程式設計 8
15.4 建構函式和複製控制 建構函式和複製控制成員不能繼承,每個類定義自己的建構函式和複製控制成員。15.4.1基類建構函式和複製控制 某些類需要只希望派生類使用的特殊建構函式,這樣的建構函式定義為protected。15.4.2 派生類建構函式 派生類的建構函式受繼承關係的影響,每個派生類建構函...
第8章(下) 物件導向程式設計(中級)
1.方法重寫 方法重寫也叫方法覆蓋,需要滿足下面的條件 1 子類的方法的引數,方法名稱,要和父類方法的引數,方法名稱完全一樣。2 子類方法的返回型別需要和父類方法返回型別一樣,或者是父類返回型別的子模擬如 父類 返回型別是 object 子類方法返回型別是string 3 子類方法不能縮小父類方法的...