用于以下方案的模式
What pattern to use for the following scenario?
我有以下类:
class Base {
public:
Base(string name) {
agg = new Aggregate(name);
}
private:
Aggregate* agg;
};
现在我需要扩展这个类:
class Derived : Base {
public:
Derived(string name) : Base(name) {
agg2 = new Aggregate2(name);
}
private:
Aggregate2* agg2;
};
我想要的是当我创建一个Base
对象时,需要创建Aggregate
,当我创建一个Derived
对象时,只应该创建Aggregate2
对象。
现在这没有发生,因为它是在构造函数中创建的Aggregate
构造函数,当我创建一个Derived
对象时调用该构造函数,并且像这样Aggregate
和Aggregate2
将被创建。
我可以将创建移动到其他方法,并在创建对象后调用该方法。
还有其他优雅的方式来做我想做的事吗?
以下内容:
class Base {
public:
explicit Base(string name) : agg(new Aggregate(name)) {}
protected:
Base() = default;
private:
std::unique_ptr<Aggregate> agg;
};
class Derived : Base {
public:
// implicit call to Base(), you may be explicit if you want
Derived(string name) : agg2(new Aggregate2(name)) {}
private:
std::unique_ptr<Aggregate2> agg2;
};
你不应该做的事情。如果第二个类不应该具有第一个 Aggregate 成员,那么正确的方法是创建两个单独的类并且不使用继承:
class Foo1 { ... };
class Foo2 { ... };
现在,如果您真的有理由使用继承,您有以下几种选择:
- 使用一个基类,Foo1 和 Foo2 都将从中派生。基类仅包含 Foo1 和 Foo2 共有的内容。您需要的聚合分别进入 Foo1 和 Foo2。(推荐(
- 让Foo1有一个工会成员(如果你知道工会的原因和原因(:
union Bla { std::unique_ptr<Agg1> a1; std::unique_ptr<Agg2> a2; };
我应该强烈强调,我几乎想不出第二个版本有意义的例子......去一个单独的基类!
试试这段代码
class Base {
public:
Base() { }
Base(string name) {
agg = new Aggregate(name);
}
void setName(string name) {
agg = new Aggregate(name);
}
private:
Aggregate* agg;
};
class Derived : Base {
public:
Derived(string name) {
agg2 = new Aggregate2(name);
}
private:
Aggregate2* agg2;
};
你可以在基类中有一个字符串类型的数据成员;它可以被赋值(与 name,在构造函数中相同(,你也可以在 Derived 中访问它(使其受到保护(以初始化 Derived 类中的 agg2。
我会为此使用构造函数重载:
class Base {
public:
Base(string name) : agg(new Aggregate(name)) {}
protected:
Base(Aggregate* agg) : agg(agg) {} //Base will take possession of the passed pointer.
private:
std::unique_ptr<Aggregate> agg;
};
class Derived : Base {
public:
Derived(string name) : Base(new Aggregate2(name)) {}
};
注意:
这假定Aggregate2
派生自Aggregate
。此假设基于这样一个事实,即删除派生类中基类的能力至少是一种非常强烈的代码气味。因此,我得出的结论是,两个聚合基本上具有相同的功能,因此保存Aggregate2
实例的第二个变量是多余的,并且Aggregate2
是将行为与关系匹配的Aggregate
子类。
- 运行同一解决方案的另一个项目的项目
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- Project Euler问题4的错误解决方案
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 此模式的C++RegEx
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- C++ 单例设计模式替代方案
- 我在这里滥用继承权吗?什么是最佳实践替代方案/模式?
- 用于以下方案的模式
- 发布者订阅模式的现代替代方案
- 寻找字符串模式的更好解决方案
- 使用本机C++、托管 C++ CLI 和 C# 解决方案在混合模式下进行调试
- 用于全局模式匹配的递归解决方案
- 等待条件的非线程替代方案.(编辑:Proactor模式与boost.asio?)
- 无法在调试模式下编译解决方案,因为缺少MSVCR100D.dll