我对C++的更高级特性有些陌生。昨天,我发布了以下问题,我了解了虚拟遗产和可怕的死亡钻石。
我还通过其他链接了解到,多重继承通常是一个糟糕的代码设计的标志,同样的结果通常可以在不使用MI的情况下更好地实现。问题是..。对于下面的问题,我不知道什么是更好的单继承方法。
我想为两种类型的数字点定义一个接口。输入数字点和输出数字点。接口应该很细,只有访问信息所需的内容。当然,绝大多数属性对于两种类型的数字点都是共同的。所以对我来说,这是一个明确的继承案例,而不是构图。
我的界面定义是这样的:
// Interface Definitions
class IDigitalPoint
{
public:
virtual void CommonDigitalMethod1() = 0;
};
class IDigitalInputPoint : virtual IDigitalPoint
{
public:
virtual void DigitialInputMethod1() = 0;
};
class IDigitalOutputPoint : virtual IDigitalPoint
{
public:
virtual void DigitialOutputMethod1() = 0;
};我的实现如下所示:
// Implementation of IDigitalPoint
class DigitalPoint : virtual public IDigitalPoint
{
public:
void CommonDigitalMethod1();
void ExtraCommonDigitalMethod2();
}
// Implementation of IDigitalInputPoint
class DigitalInputPoint : public DigitalPoint, public IDigitalInputPoint
{
public:
void DigitialInputMethod1();
void ExtraDigitialInputMethod2();
}
// Implementation of IDigitalOutputPoint
class DigitalOutputPoint : public DigitalPoint, public IDigitalOutputPoint
{
public:
void DigitialOutputMethod1();
void ExtraDigitialOutputMethod2();
}那么,我如何才能重新格式化这个结构,以避免MI?
发布于 2016-06-22 11:10:15
“多重继承通常是错误代码设计的标志”--对于此规则,纯接口的父级不算在内。您的I*类是纯接口(只包含纯虚拟函数),因此Digital*Point类在这方面是可以的。
发布于 2016-06-22 12:00:13
(多重)继承和接口往往会导致不必要的简单关系的复杂。
在这里,我们只需要一个简单的结构和很少的独立功能:
namespace example {
struct Point { T x; T y; }
Point read_method();
void write_method(const Point&)
void common_method(Point&);
void extra_common_method(Point&);
} // examplecommon_method可能是点的成员函数的候选。extra_common_method并不常见,它可能是另一个封装Point的类的候选对象。
发布于 2016-06-22 11:03:02
这正是标准库在std::basic_iostream层次结构中确实使用虚拟继承的情况。
因此,这可能是真正有意义的罕见情况。
然而,这完全取决于您为清晰起见删除的详细信息,因此不可能确定是否存在更好的解决方案。
例如,为什么输入点与输出点不同?DigitalPoint听起来就像一个有属性的东西,可以用类来建模。不过,DigitalInputPoint听起来就像.以某种方式耦合到输入源的DigitalPoint。它有不同的属性吗?不同的行为?他们是什么?为什么?
https://stackoverflow.com/questions/37965835
复制相似问题