这是更好的OO实践

which is better OO practice?

本文关键字:OO 实践 更好      更新时间:2023-10-16

我需要有关如何设计界面的建议,问题简化如下:

我必须为某些类设计一组检查类,起初只有一个类要检查,现在我需要检查一个需要新接口的新类,如下所示:

一开始,

Class Base{ blah;};
Class D1 public Base {...};
Class IChecker { virtual bool CheckIt(Base*) = 0; };
Class Checker1 public IChecker;
Class Checker2 public IChecker;
......

现在我需要检查一个新类:

Class D2 public Base {...};

要检查此 D2,我需要不同的接口

virtual bool CheckIt(const vector<unique_ptr<Base>> &) = 0;

我的问题是,哪个是更好的OO设计,我是否应该实现聚合的 IChecker

class IChecker{
    virtual bool CheckIt(Base*) = 0;
    virtual bool CheckIt(const Vector<unique_ptr<Base>>&) = 0;
}
class Checker1 public IChecker {};
class Checker2 public Ichecker {};
......

或者我应该为要检查的每种类型制作两个 ICheckers:

class ICheckerD1 { virtual bool CheckIt(D1*) = 0; }

class IcheckerD2 { virtual bool CheckIt(vector<unique_ptr<D2>>&) = 0; }

这次的实心跳棋将如下所示:

class Checker1D1 public ICheckerD1 {};
class Checker2D1 public IcheckerD1 {};
class Checker1D2 public IcheckerD2 {};

多谢!

在仅使用集合类型的情况下,如果实现单个 IChecker 类来处理多个类型,那将是更好的设计和更少的代码冗余。但是,根据您的情况,使用模板化类可能是明智的。

请记住,与 .Net 或 Java 不同,C++ 允许从类(不一定是接口)进行多次继承,因此两者都可以正常工作。

模板化类的示例如下:

template <class T>
class IChecker { 
public:
virtual bool CheckIt(const T& thingToCheck) = 0;
}

您将以这种方式继承:

class InheritChecker : public IChecker<someClass>, public IChecker<someOtherType>
{
    //Your method definitions here.
}

总结它取决于您的使用案例。如果仅将其用于集合类型,则仅对所有类型使用一个类。如果您希望能够随时使用任何类型的灵活性。使 IChecker 成为模板化类。任何人都可以继承。