首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将两个类之间的严重依赖表示为子类化的一种契约?

如何将两个类之间的严重依赖表示为子类化的一种契约?
EN

Stack Overflow用户
提问于 2012-11-29 04:44:47
回答 2查看 159关注 0票数 1

我不知道如何表达两个类的依赖/关系,这两个类都将被子类化。

假设我有两个类,MasterSlave

代码语言:javascript
运行
复制
class Master
{
  public:
    virtual void use(Slave * s) = 0;
    virtual Slave * generateFrom(int a) = 0;
};

class Slave
{
};

现在我想要对这两个类进行子类化,但不想失去它们之间的关系:

代码语言:javascript
运行
复制
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

更多信息

我有一个类Arm,它代表一个机械臂。机器人手臂的状态由一些参数(角度、距离)指定,并由类JointVariableVector表示

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

Arm将被子类化,以提供每个特定机械臂的正确功能(例如,SCARA或KUKA),并且由于不同的结构,我需要来自JointVariableVector的子类(例如。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-29 06:07:38

我会做这样的事情

代码语言:javascript
运行
复制
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();
    }
};

如果你想要更严格的测试,你可以使用

代码语言:javascript
运行
复制
assert(typeid(s)==typeid(MySlaveType*));

在你的use函数中

票数 1
EN

Stack Overflow用户

发布于 2012-11-29 05:00:25

您可以在slave类中使用变量Master,它包含创建它的Master。当调用use时,与此值进行比较,并在值相等时接受。

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13614052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档