gpt4 book ai didi

c++ - 依赖注入(inject)/继承设计模式的构造函数参数太多

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:58 25 4
gpt4 key购买 nike

所以我决定结合使用工厂设计模式和依赖注入(inject)。

class ClassA
{
Object *a, *b, *c;
public:
ClassA(Object *a, Object *b, Object *c) :
a(a), b(b), c(c) {}
};

class ClassB : public ClassA
{
Object *d, *e, *f;
public:
ClassB(Object *a, Object *b, Object *c, Object *d, Object *e, Object *f) :
ClassA(a, b, c), d(d), e(e), f(f) {}
};

现在,问题是 classB 的构造函数参数太多。这是一个单继承层的例子,但是当继承层开始越来越深,并且当每个层类需要构造更多对象时,顶层的构造函数结束时需要太多参数才能创建!

我知道我可以使用 setter 而不是构造函数,但还有其他方法吗?

最佳答案

Setter 不推荐用于此类事情,因为它们会导致部分构造的对象,这很容易出错。构造需要许多参数的对象的常见模式是使用构建器。 ClassBBuilder 的职责是创建 ClassB 对象。您将 ClassB 构造函数设为私有(private),并只允许构建者使用 friend 关系调用它。现在,构建器可以看起来像这样

ClassBBuilder {
public:
ClassBBuilder& setPhoneNumber(const string&);
ClassBBuilder& setName(consg string&);
ClassBBuilder& setSurname(const string&);
ClassB* build();
}

然后您像这样使用构建器:

ClassB* b = ClassBBuilder().setName('alice').setSurname('Smith').build();

build() 方法检查是否设置了所有必需的参数,它返回正确构造的对象或 NULL。不可能创建部分构造的对象。您仍然有一个带有许多参数的构造函数,但它是私有(private)的并且只能在一个地方调用。客户不会看到它。生成器方法还很好地记录了每个参数的含义(当您看到 ClassB('foo', 'bar') 时,您需要检查构造函数以确定哪个参数是名称,哪个是姓氏)。

关于c++ - 依赖注入(inject)/继承设计模式的构造函数参数太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268209/

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