这是更好的OO实践
which is better OO practice?
我需要有关如何设计界面的建议,问题简化如下:
我必须为某些类设计一组检查类,起初只有一个类要检查,现在我需要检查一个需要新接口的新类,如下所示:
一开始,
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 成为模板化类。任何人都可以继承。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 程序顶部的声明与定义(最佳实践)
- 选择和修改嵌套向量中的条目的最佳实践
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 指针验证的最佳实践?
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- fmt 与 Howard Hinnant 的日期:为什么从 fmt::to_string "{}"?FMT 和日期的最佳实践?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 数据包访问实践
- 多平台库设计.最佳实践
- std::使用类成员函数创建线程 - 最佳实践
- 这是更好的OO实践