我需要有关如何设计界面的建议,问题简化如下:
我必须为某些类设计一组检查类,起初只有一个要检查的类,现在我需要检查一个需要新接口的新类,如下所示:
一开始,
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 {};
非常感谢!
答案 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成为模板类。任何人都可以继承。