換句話說,如果我有一個類更改方法的保護級別是否被認爲是很好的做法?
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
是它確定寫
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
,還是有一些缺點這種方法?
換句話說,如果我有一個類更改方法的保護級別是否被認爲是很好的做法?
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
是它確定寫
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
,還是有一些缺點這種方法?
我會說這違背了多態性的目的,因爲當你寫一個接受多態類型的函數,派生類型應與它工作得很好:
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.
恕我直言,這取決於具體的你試圖解決的問題,因爲我不相信「永遠」成功的「最佳實踐」。
該方法的主要缺點是人們總是可以採取指針/參考A
並調用somemethod
哪裏是公開的。你爲什麼想要做這樣的事情?如果B
是A
和A
都有公開somemethod
那麼B
s也是如此。
因爲如果你有一個類,你可能想限制某些方法的可訪問性。例如如果你在基類中有方法A(int),A(char),A(double)也許你想在派生類中使用A說只允許A(char) –
替代方法是拋出一個異常當在錯誤的背景下使用時,但我認爲可能更好地限制方法的使用。 –
@Anders K .:重新設計你的課程可能會更好。在這種情況下,遺產不應該是私人的嗎? –
有沒有缺點用這種方法。唯一的限制是B::somemethod()
不能用B
對象/指針/引用調用。現在只能使用A
的指針或引用來調用它。
事實上,我看到有時候這個限制是故意引入的。這種情況是當class B
的開發人員想要傳達這樣的消息,即somemethod()
旨在被稱爲僅使用基類句柄多態地。
沒有缺點。
但是沒有真正的優勢來做到這一點。
您仍然可以通過指向案例類的指針訪問somemethod()
。
所以在技術方面沒有缺點和優點。
所以現在我們轉移到使用你的對象是多麼容易。這裏有一個缺點,因爲你混淆了對象的用戶(爲什麼它在這個級別受到保護,而不是在較低級別)?所以你正在爲自己創造工作,記錄你爲什麼做出這個決定,以及你通過使用這種技術試圖達到什麼目的。
你真的想達到什麼目的?
掛起,所以有一個缺點,但沒有缺點?有什麼不同? –
沒有'技術'缺點。缺點是對用戶來說都是精神上的問題。 –
這將工作。 – iammilind
那麼,它從語言/編譯器的角度來看,但爲什麼你會首先定義一個虛擬函數。 – AraK