gpt4 book ai didi

c++ - 如何使用装饰器模式直接修改基类成员?

转载 作者:行者123 更新时间:2023-11-28 02:32:45 24 4
gpt4 key购买 nike

基类 A:

class A {
public:
A() {}
~A() {}
void methodOfA() { fill(array_.begin(), array_.end(), 100); }
private:
vector<int> array_;
};

装饰类B:

class B: public A {
A* a_;
public:
B(A* a) { a_ = a; }
~B() {}
A* getA() { return a_; }
};

现在,如果我创建 B 的实例并按如下方式使用它:

A a;
B b(&a);
b.methodOfA();

我想让 b 访问或更改 a 拥有的一切。为此,可以使用:

b.getA()->methodOfA();

这对我来说不太好,有没有办法做类似的事情:

b.methodOfA();

但达到与b.getA()->methodOfA();相同的效果;请注意,A 可能没有复制构造函数来将所有内容复制到 B,我希望在 a 中对 b 完成所有操作。

澄清:如果我在 B 中覆盖 A 的每个成员函数(例如 methodOfA()),我可以实现上面我想要的。但是 A 中大约有 50 个函数需要覆盖。有没有更好的解决方案?

最佳答案

首先,A::methodOfA()需要是虚拟的。

然后,在 B 中,您需要添加:

virtual void methodOfA() { a_->methodOfA(); }

这就是装饰器模式。

理论上可能有一个实用程序,给定一个类,自动为它生成一个装饰器,但我不知道有什么。

您可以采取多种措施来减少 A 的方法数量以便更轻松地编写装饰器:

  1. 将实际上不需要不同的多个方法合并为一个。例如,raiseFlag()lowerFlag()可以变成setFlag( bool flag ) .

  2. 提取A的公共(public)接口(interface)进入一个单独的类(class) I , 并同时制作 AB扩展 I .然后,删除 A 的实用方法(调用同一接口(interface)其他方法实现的方法)放在I中,并使它们成为非虚拟的。因此,您将引用 I它自己实现了一些方法,(自己调用其他方法)和这个 I将由 B 的实例实现其中每个虚拟方法委托(delegate)(装饰)A 实例的相应虚拟方法.

另请注意,通过为原始接口(interface)中的每个方法编写一个装饰器方法来实现装饰器模式的问题只是生活中的一个事实,与优雅无关。在工程中,优雅是指避免黑客攻击,而不是节省击键次数。

关于c++ - 如何使用装饰器模式直接修改基类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28498662/

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