换句话说,如果我有一个班级
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
可以写
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
或者这种方法有一些缺点吗?
答案 0 :(得分:4)
这种方法的主要缺点是,总是可以对A
采用指针/引用,并调用公共的somemethod
。你为什么要做这样的事情?如果B
是A
,并且A
的公开 somemethod
,则B
也是如此。
答案 1 :(得分: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.
恕我直言,这取决于你要解决的具体问题,因为我不相信“永远”成功的“最佳实践”。
答案 2 :(得分:0)
这种方法有没有缺点。唯一的限制是B::somemethod()
无法使用B
对象/指针/引用调用。现在只能使用A
的指针或引用来调用它。
事实上,我已经看到有时会故意引入这种限制。这种情况是class B
的开发人员希望使用基类句柄传达somemethod()
只能被称为多态的消息。
答案 3 :(得分:0)
没有缺点。
但这样做没有真正的优势。
您仍然可以通过指向案例类的指针访问somemethod()
。
因此技术方面没有缺点也没有优势 所以现在我们开始讨论使用对象是多么容易。这里有一个缺点,因为你让对象的用户感到困惑(为什么它在这个级别受到保护而不是较低级别)?因此,您正在为自己创建工作,记录您做出此决定的原因以及您尝试使用此技术实现的目标。
你真正想要实现的目标是什么?