2011-09-28 103 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

没有'技术'缺点。缺点是对用户来说都是精神上的问题。 –

相关问题