c++:对于多重继承类的子类中的重复成员字段,什么是好的重构
c++: What is a good refactor for a duplicate member field in the subclass of a multiply-inherited class?
欢迎对问题进行更好的编辑。
我想以某种方式重构这三个类以删除class C
中表示的重复字段(请参阅层次结构)。我想过将字段拉到父类中,但问题是 A 和 B 不够相似,不能被视为"is-a",C 被视为两者,而且它实际上只是一个成员字段,因此创建一个类只是为了保存一件事似乎有点矫枉过正。
等级制度:
(abstract data type)
class A : public O {
public:
//...
std::string GetName();
std::string GetName() const;
void SetName(std::string name);
//...
protected:
//...
std::string _name;
//...
};
//Methods and fields shown here represent the exact same representative data as in A but the classes are so dissimilar as to not be considered "is-a" relationship.
(abstract data type)
class B {
public:
//...
std::string GetName();
std::string GetName() const;
void SetName(std::string name);
//...
protected:
//...
std::string _name;
//...
};
(concrete)
class C : public A, public B {
public:
//...
C(/*..Other parameters..*/, std::string name, /*....*/)
: A(name, /*...*/), B(name, /*...*/) {
/*...*/
}
//...
private:
//...
};
如前所述,您可以保持原样,也可以考虑对类 C 使用组合而不是继承,例如:
class C : public A
{
public:
// ...
// The GetName and SetName methods are inherited from A.
private:
B* b;
};
或
class C
{
public:
// ...
std::string GetName();
std::string GetName() const;
void SetName(std::string name);
private:
A* a;
B* b;
};
看看这个问题和答案:摆脱丑陋的 if 语句清楚地表明,正如@Andre提到的,你当前的代码是完全可以接受的,试图"修复"它可能会导致同样的痛苦和头脑打击。
保持原样,这很好。
由于C
将相同的name
参数传递给A
和B
,因此您可以通过虚拟继承获得所需的内容。 下面的V
被定义为A
、B
和C
的公共基类,但是通过虚拟继承,它们都共享同一个实例。
class V {
public:
std::string GetName();
std::string GetName() const;
void SetName(std::string name);
protected:
std::string _name;
V () {}
V (std::string n) : _name(n) {}
~V () {}
};
class A : virtual public V, public O {
//...
};
class B : virtual public V {
//...
};
class C : virtual public V, public A, public B {
public:
C (/*...otherargs,*/std::string name/*,moreargs...*/)
: V(name), A(/*...*/), B(/*...*/) {
//...
}
//...
};
相关文章:
- C++:用户定义的类,以成员字段作为地址
- 用于基于成员字段或函数创建比较器的快捷方式
- 无法初始化以 std::byte 作为成员类型的位字段
- 与位字段的并集为位字段成员提供了意外值
- 依赖注入:依赖关系需求字段/成员
- uninit_member:非静态类成员字段 m_cJobState.bstatus 未在此构造函数中初始化,也不在其调
- 派生类中的成员字段别名(无访问器功能)
- 使用静态类成员而不是私有字段之间的速度差异是什么?
- 如何使用 Clang 查找所有成员字段读/写?
- 位字段成员的类型
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- C 模板功能在任何集合成员字段上迭代
- 一次启用 MANY 类的成员字段,具体取决于模板<T>
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化
- 如何在C++的专用模板类中访问模板类成员字段
- 动态链接到 c++ 静态成员字段时符号查找失败
- std :: async在成员字段的成员功能上
- C :初始化成员结构的静态字段的正确方法
- 位字段成员的大小
- 如何为具有位字段成员的类专门化“swap”