2008-11-28 46 views
1

跨越這句話剛來到在一本書上說OOP我讀,繼承,親子和壓倒一切的

一個孩子只允許增加 功能和添加功能。 小孩絕不允許刪除 功能。如果您發現子女需要刪除功能 ,這表示子女 應該出現在繼承層次結構的父級之前!

但我的問題是,這不是什麼壓倒一切嗎?

回答

4

您可以通過覆蓋刪除功能。但通常你用它來改變行爲。讓班級按照應有的方式行事。

如果行爲被刪除,那麼它往往是一個糟糕的類設計的標誌。

+0

所以真的在C#中,一切都從system.object繼承,是否正確?你可以改變system.object中方法的行爲,或者你不使用它們,但是你永遠不會刪除它們。 – GregD 2008-11-28 21:35:26

+0

並非總是如此。那麼NullObjectPattern :) – OscarRyz 2008-11-28 21:35:52

+0

C#有這樣的事情嗎?請記住,我是一名初學者。在我看來,null仍然是*某種東西*,儘管它代表了一個對象的缺席。這仍然是一些東西的定義。 – GregD 2008-11-28 21:40:22

1

覆蓋方法時,可能會在覆蓋期間的某個時刻調用父實現,因此使用覆蓋向父實現添加功能。

3

孩子無法刪除功能 - 它可以改變它,但你不能說公開私有方法。

繼承的一點是,您可以像處理父母一樣處理孩子。如果你的'Person'超類是'Employee'子類,那麼Employee類沒有呼吸()方法是沒有意義的。

0

這就是爲什麼重寫(以及一般來說,任何虛擬成員)應該非常仔細地做... 事實上,通常,當重寫時,您應該嘗試編碼基類和派生類,使派生類的實現首先調用基實現,然後執行它的附加功能......

,但這一原則是不是在面向對象的語言執行,而常常受到侵犯......的

例爲什麼這是不好的

想象一下,你有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類...他們第一次嘗試使用新的基類。

1

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 
    } 
} 
0

如果你的孩子需要刪除父的功能,那麼家長必須聲明爲接口。 因爲接口是定義必須遵守實現者的契約的機制。

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 principleLiskov substitution principle

繼承的拇指規則是「將附加功能添加到現有的一個」。