2011-09-28 98 views

回答

2

我會說這違背了多態性的目的,因爲當你寫一個接受多態類型的函數,派生類型應與它工作得很好:

void fun(A* a){ 
    a->somemethod(); 
} 
... 
A* a = new B(); 
fun(a); // Shouldn't this work?! 
     // According to Liskov Principle, you are doing it wrong! 
     // but really who cares, it depends on your justification 
     // of a solution to the the problem at hand. 

恕我直言,這取決於具體的你試圖解決的問題,因爲我不相信「永遠」成功的「最佳實踐」。

+0

這將工作。 – iammilind

+0

那麼,它從語言/編譯器的角度來看,但爲什麼你會首先定義一個虛擬函數。 – AraK

4

該方法的主要缺點是人們總是可以採取指針/參考A並調用somemethod哪裏是公開的。你爲什麼想要做這樣的事情?如果BAA都有公開somemethod那麼B s也是如此。

+0

因爲如果你有一個類,你可能想限制某些方法的可訪問性。例如如果你在基類中有方法A(int),A(char),A(double)也許你想在派生類中使用A說只允許A(char) –

+0

替代方法是拋出一個異常當在錯誤的背景下使用時,但我認爲可能更好地限制方法的使用。 –

+0

@Anders K .:重新設計你的課程可能會更好。在這種情況下,遺產不應該是私人的嗎? –

0

沒有缺點用這種方法。唯一的限制B::somemethod()不能用B對象/指針/引用調用。現在只能使用A的指針或引用來調用它。

事實上,我看到有時候這個限制是故意引入的。這種情況是當class B的開發人員想要傳達這樣的消息,即somemethod()旨在被稱爲僅使用基類句柄多態地

0

沒有缺點。

但是沒有真正的優勢來做到這一點。
您仍然可以通過指向案例類的指針訪問somemethod()

所以在技術方面沒有缺點和優點。
所以現在我們轉移到使用你的對象是多麼容易。這裏有一個缺點,因爲你混淆了對象的用戶(爲什麼它在這個級別受到保護,而不是在較低級別)?所以你正在爲自己創造工作,記錄你爲什麼做出這個決定,以及你通過使用這種技術試圖達到什麼目的。

你真的想達到什麼目的?

+0

掛起,所以有一個缺點,但沒有缺點?有什麼不同? –

+0

沒有'技術'缺點。缺點是對用戶來說都是精神上的問題。 –

相關問題