如何将两个类之间的严重依赖关系表示为子类化的契约
How to express a heavy dependency between two classes as sort of contract for subclassing?
我不知道如何表达两个类的依赖关系,这两个类都将被子类化。我认为一个例子可以帮助这里:
假设我有两个类,Master
和Slave
。Master
类有一些方法,如void use(Slave * s)
和Slave * generateFrom(int a)
class Master
{
public:
virtual void use(Slave * s) = 0;
virtual Slave * generateFrom(int a) = 0;
};
class Slave
{
};
现在我想对这两个类进行子类化,但不想失去它们之间的关系:
ConcreteMasterA ma();
ConcreteSlaveA * sa = ma.generateFrom(1);
ConcreteMasterB mb();
mb.use(sa); // THIS SHALL NOT WORK
Master * m = new ConcreteMasterA();
Slave * s = m->generateFrom(1); //s should now be a ConcreteSlaveA
m->use(s); // THIS SHALL WORK
有没有一种方法可以用C++类/模板/其他什么来表达这种关系?
其他信息
也许我需要更具体一点:
我有代表机械臂的Arm
类。机械臂的状态由一些参数(角度、距离)指定,并应由JointVariableVector
类表示
我想稍后使用另一个类来控制arm,但这个类将只使用Arm
和JointVariableVector
导出的方法。
Arm
将被细分为子类,以提供每个特定机械臂的正确功能(例如SCARA或KUKA),并且由于不同的结构,我需要JointVariableVector
的子类(例如,一个子类只有2个角度,另一个子类有3个角度和一个距离)
我会做一些类似的事情
class ConcreteMasterA:public Master
{
typedef ConcreteSlaveA MySlaveType;
public:
virtual void use(Slave * s){
MySlaveType* ms = dynamic_cast<MySlaveType*>(s);
assert(ms); // or other type of error handling
}
virtual Slave * generateFrom(int a){
return new MySlaveType();
}
};
如果你想要更严格的测试,你可以使用
assert(typeid(s)==typeid(MySlaveType*));
在您的使用功能
您可以在包含创建它的Master的slave类中使用变量Master。当调用use时,与该值进行比较,并在值相等时接受。
class Slave {
private:
Master * creator;
public:
Slave(Master* master) : creator(Master) {};
Master * getMaster() { return creator; }
}
class Master {
Slave *generateForm(int) {
return new Slave(this);
}
void use(Slave) {
if (Slave.getMaster) == this) {
do stuff;
}
}
}
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 对在不同二进制文件中创建的对象文件的依赖关系
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 为什么包含需要进一步的依赖关系?
- 使用 cmake 获取外部依赖关系
- CMake 外部和内部静态库的循环依赖关系
- 在没有Xcode的macOS中开发具有依赖关系的应用程序
- "std::shared_ptr"循环依赖关系是如何导致问题的