gpt4 book ai didi

c++ - 我应该避免多重实现继承吗?

转载 作者:太空狗 更新时间:2023-10-29 21:33:01 26 4
gpt4 key购买 nike

<分区>

我想为可以从外部方法/类访问的类的不同属性定义接口(interface)。

  • 我使用多重实现继承(= 从具体类继承而不是接口(interface)继承),这被认为是一种不好的做法 ( point 3 from here )。

  • 我使用继承来重用代码。如前所述here , 最好使用组合而不是继承来重用代码。但是通过组合,我所有的 MyObj1,MyObj2,...,MyObj1000 都将具有相同的 get 和 set 方法,而我很少需要重新实现它们。

这个场景是否完美地说明了代码重用的多重实现继承是好的,还是这段代码完全错误,我应该使用一些聪明的语法/模式来避免这种设计? 我问这个问题是因为我相信后者。

#include <string>
#include <iostream>

// interface of object with name
class BaseName {
public:
virtual void setName(const std::string& val) { name = val; }
virtual std::string getName() const { return name; }
private:
std::string name;
};

// user of interface of objects with name
void nameUser(BaseName* b) {
std::cout << b->getName() << std::endl;
}

// interface of object with id
class BaseID {
public:
virtual void setID(int val) { id = val; }
virtual int getID() const { return id; }
private:
int id = 0;
};

// user of interface of objects with id
void idUser(BaseID* b) {
std::cout << b->getID() << std::endl;
}

class MyObj1 : public BaseID, public BaseName {
public:
void setName(const std::string& val) override {
/* update internal state that depends on name. this is why "virtual" is required */
BaseName::setName(val);
}

/* methods and fields specific to MyObj1 */
};

// MyObj2,...,MyObj999

class MyObj1000 : public BaseID, public BaseName {
public:
/* methods and fields specific to MyObj1000 */
};

int main() {
MyObj1 o1;
o1.setName("xxx");
o1.setID(18);

MyObj1000 o2;
o2.setName("yyy");
o2.setID(-738);

nameUser(&o1);
nameUser(&o2);
idUser(&o1);
idUser(&o2);
}

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