如何将两个类之间的严重依赖关系表示为子类化的契约

How to express a heavy dependency between two classes as sort of contract for subclassing?

本文关键字:依赖 关系 契约 子类 表示 之间 两个      更新时间:2023-10-16

我不知道如何表达两个类的依赖关系,这两个类都将被子类化。我认为一个例子可以帮助这里:

假设我有两个类,MasterSlaveMaster类有一些方法,如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,但这个类将只使用ArmJointVariableVector导出的方法。

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