2010-01-29 74 views
1

如何隱藏子類中的父類屬性。如何隱藏子類中的父類屬性

其中,父類有一個名爲「Parent」的屬性,我不想在子類中使用它。我怎樣才能刪除或隱藏它。

+1

你問大約三個完全不同的語言 - 這是一個你真的在用嗎? – 2010-01-29 14:04:59

+0

剛剛看了一下標籤(我首先假定你指的是成員),但C++(和我認爲Java)沒有屬性。 – Yacoby 2010-01-29 14:05:33

+0

@Yacoby:是的,Java也沒有。 – jason 2010-01-29 14:11:27

回答

11

所以這聽起來像你問以下​​。你有

class Parent { 
    public SomeType ParentProperty { get; set; } 
} 

class Child : Parent { } 

,你要隱藏SomeProperty從在Child實例可見。

不要這樣做!不要隱藏基類中可見的屬性。首先,它很容易得到解決:

Parent p = new Child(); 
p.ParentProperty; // oops! 

其次,它是一個巨大的違反Liskov substitution principle的。基本上,該原則指出,關於Parent的所有實例,您知道的任何事情對於Child的所有實例都應該是真實的。在這裏,我們知道Parent的所有實例都有一個名爲ParentProperty的可見屬性,其類型爲SomeType。因此,Child的所有情況都應該(道德應該)成立。

你能告訴我們爲什麼你想這樣做,也許我們可以建議一個替代方案?

+0

注意私人會員建議使用不同的外殼。 – Dykam 2010-01-29 14:14:32

+0

,但它在父類 – Santhosh 2010-01-29 14:16:46

+0

@santose中公開:您是否可以說明您是在討論嵌套類還是派生類? – jason 2010-01-29 14:21:41

0

如果你在派生類的時候說你的孩子類,那麼幸運的是沒有辦法讓它走。爲什麼這將是不好的故事看看這段代碼:

base myObj = objectFactory.Create(); myObj.theMethodHiddenAway();

工廠可以返回任何基類型對象,包括從基類派生的所有類。編譯器需要決定什麼版本的MethodHiddenAway來調用編譯時間(重載解析),並且因爲它沒有具體類型的編譯時間,如果可以通過繼承使方法消失,編譯器不會知道MethodHiddenAway是否甚至存在。

我建議你看看你的設計,因爲你所要求的氣味就像是兩個設計缺陷之一。要麼這個方法不在那裏,要麼你派生類不應該繼承基類

0

你不能。子類引用將始終隱式轉換爲父類引用,因此無法阻止在不從父類中刪除該屬性的情況下使用該屬性。

2

不要。

如果你需要這個,你有一個設計問題。 Liskov Substitution Principle告訴您,您的Child類應該可以替代Parent類。這意味着所有使用Parent類的代碼都應該可以使用您的Child類。如果你想刪除一個屬性,情況並非如此。無論使用哪個特定屬性,您都無法使用子項替換父項。

2

我想明顯的問題/答案是,也許你應該讓財產私人。 (當然,除非你有源沒有訪問先跟)

1

希望這幫助,您可以陰影屬性和只讀設置吧:)