跨越這句話剛來到在一本書上說OOP我讀,繼承,親子和壓倒一切的
一個孩子只允許增加 功能和添加功能。 小孩絕不允許刪除 功能。如果您發現子女需要刪除功能 ,這表示子女 應該出現在繼承層次結構的父級之前!
但我的問題是,這不是什麼壓倒一切嗎?
跨越這句話剛來到在一本書上說OOP我讀,繼承,親子和壓倒一切的
一個孩子只允許增加 功能和添加功能。 小孩絕不允許刪除 功能。如果您發現子女需要刪除功能 ,這表示子女 應該出現在繼承層次結構的父級之前!
但我的問題是,這不是什麼壓倒一切嗎?
您可以通過覆蓋刪除功能。但通常你用它來改變行爲。讓班級按照應有的方式行事。
如果行爲被刪除,那麼它往往是一個糟糕的類設計的標誌。
覆蓋方法時,可能會在覆蓋期間的某個時刻調用父實現,因此使用覆蓋向父實現添加功能。
孩子無法刪除功能 - 它可以改變它,但你不能說公開私有方法。
繼承的一點是,您可以像處理父母一樣處理孩子。如果你的'Person'超類是'Employee'子類,那麼Employee類沒有呼吸()方法是沒有意義的。
這就是爲什麼重寫(以及一般來說,任何虛擬成員)應該非常仔細地做... 事實上,通常,當重寫時,您應該嘗試編碼基類和派生類,使派生類的實現首先調用基實現,然後執行它的附加功能......
,但這一原則是不是在面向對象的語言執行,而常常受到侵犯......的
例爲什麼這是不好的
想象一下,你有CompanyA設計類型(類)電話
namespace CompanyA {
class Phone {
public void Dial() {
// do work to dial the phone here
}
}
}
沒有iagine公司B定義了某種類型BetterPhone,使用A公司的手機作爲基本類型...
namespace CompanyB {
class BetterPhone: CompanyA.Phone {
public void Dial() {
Console.WriteLine("BetterPhoneDial");
EstablishConenction();
base.Dial();
}
}
}
現在公司A,其手機類是通過使用其他公司(公司C,D等)決定建立連接對於課堂中的學習是有用的,並且修改了CompanyA.Phone,並增加了一個EsatblishCOnnection()方法,也許還有一個不同的實現方法......直到我們有「新」關鍵字,這種情況會打破CompanyB的BetterPhone類...他們第一次嘗試使用新的基類。
No.其實你會被增強功能(以消極的方式)
比方說,你的新功能是「什麼也不做」,但法,什麼客戶代碼的看還是一樣接口
您不能擁有刪除其父項方法的子類。
這是可能的
class Parent {
public void method_one(){
print "Hello";
}
}
class Child extends Parent {
public void method_one(){
// do nothing
}
}
但是,這並不:
class Parent {
public void method_one(){
print "Hello";
}
}
class Child extends Parent {
// Attempt remove the method visibility, thus remove funcionality
private void method_one(){
// do nothing
}
}
如果你的孩子需要刪除父的功能,那麼家長必須聲明爲接口。 因爲接口是定義必須遵守實現者的契約的機制。
E.g.
public interface IContract
{
void DoWork();
}
public class BaseContract: IContract
{
public virtual void DoWork()
{
//perform operation A
}
}
現在,如果你想聲明新EnhancedContract類,你可以從BaseContract或IContract派生它取決於需求。 如果您想對基地的操作A執行附加操作,則可以從BaseContract繼承它,如下所示。
public class EnhancedContract: BaseContract
{
public override void DoWork()
{
//perform operation B
base.DoWork();
//perform operation C
}
}
但是,如果您對在EnhancedContract的DoWork方法中執行操作A沒有興趣,則從IContract繼承它。
這確保了EnhancedWork將執行DoWork(),但不保證在其中執行'操作A'。
public class EnhancedWork:IContract
{
public void DoWork()
{
//perform operation D
}
}
這對於視頻下載非常重要,因爲它會阻止用戶在下面的視頻中執行操作。
EnhancedContract e = new EnhancedContract();
BaseContract b = e;
我相信所有的這些操作是很重要的,同時瞭解Open Closed principle,Liskov substitution principle。
繼承的拇指規則是「將附加功能添加到現有的一個」。
所以真的在C#中,一切都從system.object繼承,是否正確?你可以改變system.object中方法的行爲,或者你不使用它們,但是你永遠不會刪除它們。 – GregD 2008-11-28 21:35:26
並非總是如此。那麼NullObjectPattern :) – OscarRyz 2008-11-28 21:35:52
C#有這樣的事情嗎?請記住,我是一名初學者。在我看來,null仍然是*某種東西*,儘管它代表了一個對象的缺席。這仍然是一些東西的定義。 – GregD 2008-11-28 21:40:22