改变一种方法的保护级别是否被认为是一种良好的做法
Is it considered good practice to change the protection level of a method?
换句话说,如果我有一个类
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
写可以吗
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
或者这种方法有缺点吗?
这种方法的主要缺点是,总是可以使用指向A
的指针/引用,并在公共的地方调用somemethod
。你为什么要做这样的事?如果B
是A
,并且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()
。
所以在技术方面没有缺点也没有优点
现在我们来看看使用你的对象有多容易。这里有一个缺点,因为你混淆了对象的用户(为什么它在这个级别受到保护,而不是在更低的级别(?因此,你正在为自己创造工作,记录你为什么做出这个决定,以及你试图通过使用这种技术来实现什么。
你真正想要实现的是什么?
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 在C++编程中继续下一行的另一种方法是什么?
- 检查一种类型是包括通用lambda的函子
- 在C++中定义虚拟get和set函数是否被认为是一种好的做法
- 将main()放在C++源代码的顶部是否被认为是一种糟糕的约定
- std::conditional 的可变模板化使用,其中一种类型是实例化失败
- 在操作数据成员时:以下哪一种被认为是最佳实践
- 除以2的另一种方法是什么?
- c++是一种基于组件的体系结构,通过继承实现,被认为是良好的实践
- 哪一种方法是更快的向量(插入后排序)或集合
- 将右值引用作为左操作数重载加法操作符被认为是一种良好的做法
- 改变一种方法的保护级别是否被认为是一种良好的做法
- 当我编译我的c++代码时,avast认为这是一种病毒