如果其中一个具体的构建器需要额外的参数,如何创建统一的接口来构建构建器模式中的构建器?
How to create uniform interface to build for builders in builder patterns, if one of concrete builders take extra argument?
class Builder
{
public:
virtual void Build(int a) = 0;
};
class ConcreteBuilder1 : public Builder
{
public:
void Build(int a);
};
class ConcreteBuilder2 : public Builder
{
public:
void Build(int a. struct A* a);
};
所以我的问题是如何设计 Build() 方法来获取两个参数(int、struct* A)。但是具有相同的生成器界面?
这样,
int x;
struct A* y;
Builder concrteBuilder1 = new ConcreteBuilder1();
concrteBuilder1 ->Build() // // Here I am forced to pass struct A* a eventhough not needed for concerte builder1 . And I am also forced to forced to change Builder interface too.
如果我没有清楚地表达问题,我深表歉意。
添加
using Builder::Build;
派生的 class 的声明。这会将此符号导入派生的 class,并使其和派生的 class 方法同名,可用于重载解析。即
using Builder::Build;
void Build(int a);
我忽略了这样一个事实,即您无论如何都无法构造派生的 class,因为它无法从基础 class.
实现这个纯虚函数
从具有相同参数和相同 return 值的函数派生 class 覆盖它们的函数。
因此,如果您声明一个函数,例如...
class Builder
{
public:
virtual void Build() = 0;
};
class ConcreteBuilder1 : public Builder
{
public:
void Build(int a);
};
class ConcreteBuilder2 : public Builder
{
public:
void Build(int a. struct A* a);
};
此处,ConcreteBuilder1 中的 Build 函数 class 被视为新函数,而不是覆盖函数。
所以试试这个。
class Builder
{
public:
virtual void Build(int a, A* b = 0) = 0;
};
class ConcreteBuilder1 : public Builder
{
public:
void Build(int a);
};
class ConcreteBuilder2 : public Builder
{
public:
void Build(int a, struct A* a);
};
希望对你有所帮助。
Builder 通常构建另一个 class 的对象。您可以尝试类似的操作:
class ToBuild
{
//some code here
};
class Builder
{
public:
virtual ToBuild * build() = 0;
};
class ConcreteBuilder : public Builder
{
int _valA;
int _valB;
public:
ToBuild * build() override
{
ToBuild * obj = new ToBuild();
//initalize obj using _valA and _valB variables;
return obj;
}
ConcreteBuilder& valA(const int val)
{
_valA = val;
return *this;
}
ConcreteBuilder& valB(const int val)
{
_valB = val;
return *this;
}
};
int main()
{
ConcreteBuilder b;
ToBuild * obj = b.valA(1).valB(2).build();
//some code
delete obj;
return 0;
}
[编辑]
您可以编写另一个派生 class 并使用任意数量的参数,并且仍然使用单个 'build' 方法。
class Builder
{
public:
virtual void Build(int a) = 0;
};
class ConcreteBuilder1 : public Builder
{
public:
void Build(int a);
};
class ConcreteBuilder2 : public Builder
{
public:
void Build(int a. struct A* a);
};
所以我的问题是如何设计 Build() 方法来获取两个参数(int、struct* A)。但是具有相同的生成器界面?
这样,
int x;
struct A* y;
Builder concrteBuilder1 = new ConcreteBuilder1();
concrteBuilder1 ->Build() // // Here I am forced to pass struct A* a eventhough not needed for concerte builder1 . And I am also forced to forced to change Builder interface too.
如果我没有清楚地表达问题,我深表歉意。
添加
using Builder::Build;
派生的 class 的声明。这会将此符号导入派生的 class,并使其和派生的 class 方法同名,可用于重载解析。即
using Builder::Build;
void Build(int a);
我忽略了这样一个事实,即您无论如何都无法构造派生的 class,因为它无法从基础 class.
实现这个纯虚函数从具有相同参数和相同 return 值的函数派生 class 覆盖它们的函数。
因此,如果您声明一个函数,例如...
class Builder
{
public:
virtual void Build() = 0;
};
class ConcreteBuilder1 : public Builder
{
public:
void Build(int a);
};
class ConcreteBuilder2 : public Builder
{
public:
void Build(int a. struct A* a);
};
此处,ConcreteBuilder1 中的 Build 函数 class 被视为新函数,而不是覆盖函数。
所以试试这个。
class Builder
{
public:
virtual void Build(int a, A* b = 0) = 0;
};
class ConcreteBuilder1 : public Builder
{
public:
void Build(int a);
};
class ConcreteBuilder2 : public Builder
{
public:
void Build(int a, struct A* a);
};
希望对你有所帮助。
Builder 通常构建另一个 class 的对象。您可以尝试类似的操作:
class ToBuild
{
//some code here
};
class Builder
{
public:
virtual ToBuild * build() = 0;
};
class ConcreteBuilder : public Builder
{
int _valA;
int _valB;
public:
ToBuild * build() override
{
ToBuild * obj = new ToBuild();
//initalize obj using _valA and _valB variables;
return obj;
}
ConcreteBuilder& valA(const int val)
{
_valA = val;
return *this;
}
ConcreteBuilder& valB(const int val)
{
_valB = val;
return *this;
}
};
int main()
{
ConcreteBuilder b;
ToBuild * obj = b.valA(1).valB(2).build();
//some code
delete obj;
return 0;
}
[编辑] 您可以编写另一个派生 class 并使用任意数量的参数,并且仍然使用单个 'build' 方法。