gpt4 book ai didi

c++ - 如何将两个类之间的严重依赖性表达为子类化的一种契约?

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:21 24 4
gpt4 key购买 nike

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

假设我有两个类,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 代表机器人 ARM 。机器人 ARM 的状态由一些参数(角度、距离)指定,并应由 JointVariableVector

类表示

我想稍后使用另一个类来控制 ARM ,但是这个类只能使用 ArmJointVariableVector 导出的方法。

Arm 将被子类化以提供每个特定机器人 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*));

在你的使用函数中

关于c++ - 如何将两个类之间的严重依赖性表达为子类化的一种契约?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com