哪个OO练习更好?

时间:2016-03-03 02:43:17

标签: c++ oop

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

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

一开始,

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 {};

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果您在仅使用集合类型的情况下实现单个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成为模板类。任何人都可以继承。