改变一种方法的保护级别是否被认为是一种良好的做法

Is it considered good practice to change the protection level of a method?

本文关键字:一种 认为是 保护 方法 改变 是否      更新时间:2023-10-16

换句话说,如果我有一个类

class A
{
public:
   A() { .. }
   virtual void somemethod() { .. }
};

写可以吗

class B : public A
{
public:
   B() { .. }
protected:
   virtual void somemethod() { .. }
};

或者这种方法有缺点吗?

这种方法的主要缺点是,总是可以使用指向A的指针/引用,并在公共的地方调用somemethod。你为什么要做这样的事?如果BA,并且A s具有公共somemethod,则B s也是。

我认为这违背了多态性的目的,因为当你编写一个接受多态类型的函数时,派生类型应该同样适用:

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.

IMHO,这取决于你试图解决的具体问题,因为我不相信"总是"成功的"最佳实践"。

这种方法没有缺点。唯一的限制B::somemethod()不能用B对象/指针/引用调用。现在只能使用A的指针或引用来调用它。

事实上,我看到有时这种限制是有意引入的。这样的场景是当class B的开发人员想要传达这样一个消息时,即somemethod()意味着只能使用基类句柄以多形式调用。

无缺点。

但这样做并没有真正的优势
您仍然可以通过指向case类的指针访问somemethod()

所以在技术方面没有缺点也没有优点
现在我们来看看使用你的对象有多容易。这里有一个缺点,因为你混淆了对象的用户(为什么它在这个级别受到保护,而不是在更低的级别(?因此,你正在为自己创造工作,记录你为什么做出这个决定,以及你试图通过使用这种技术来实现什么。

你真正想要实现的是什么?

相关文章: