- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个接口(interface)层次结构:
class A
{
virtual void commonFunc() = 0;
};
class B1 : public A
{
virtual void b1SpecificFunc() = 0;
};
class B2 : public A
{
virtual void b2SpecificFunc() = 0;
};
接口(interface) A 的存在只是为了避免重复 commonFunc() 函数。
现在,如果我想实现它以获得 2 个可实例化类 ImplB1 和 ImplB2,我可以这样做:
class ImplA
{
virtual void commonFunc();
};
class ImplB1 : public ImplA
{
virtual void b1SpecificFunc();
};
class ImplB2 : public ImplA
{
virtual void b2SpecificFunc();
};
问题在于它使 ImplA 可以实例化,而我不想这样做。我只希望 ImplB1 和 ImplB2 是可实例化的,因为 ImplA 是抽象的东西,它的存在只是为了共同实现共同的功能。
请问我该如何设计?谢谢。
最佳答案
Interface A only exist to avoid duplicating the commonFunc() function.
您肯定是想避免重复其声明,不是吗?
class ImplA
{
virtual void commonFunc();
};
这大概应该是:
class ImplA : public A
{
virtual void commonFunc();
};
我想重点是 ImplA
实际上有一个 commonFunc
的实现。因此,为了这个答案的简洁起见,让我们将其放入类定义中:
class ImplA : public A
{
virtual void commonFunc() {} // implementation
};
The problem with this is that it makes ImplA instanciatable.
只需将 ImplA
的析构函数设为纯虚拟即可:
class ImplA : public A
{
public:
virtual ~ImplA() = 0 {}
private:
virtual void commonFunc() {}
};
即使在派生类的函数内部,这也会阻止实例化。例如,以下将产生编译器错误:
class ImplB1 : public ImplA
{
public:
virtual void b1SpecificFunc()
{
ImplA a; // error, cannot instantiate abstract class
}
};
事实上,您甚至无法在其自己的函数中实例化该类:
class ImplA : public A
{
public:
virtual ~ImplA() = 0 {}
private:
virtual void commonFunc()
{
ImplA a; // error, cannot instantiate abstract class
}
};
但说真的,这一切似乎都过度设计。也许您真正需要的是使 commonFunc
成为 A
的非虚保护函数,派生类可以在需要时调用它。
或者 commonFunc
可以只是一个独立的效用函数?
关于c++ - 正确实现类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29015795/
我正在尝试将多个水平链接的 Button 和 TextView 垂直链接为 View 集,但仍保持平面 View 层次结构。这是我的初始布局和代码:
到目前为止,我已经在Google BigQuery上训练了几种模型,目前我需要查看模型的外观(即架构,损失函数等)。 有没有办法获取这些信息? 最佳答案 仔细阅读文档后,我可以说该功能尚不存在。我什至
本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下: 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个
我是一名优秀的程序员,十分优秀!