【发布时间】:2015-05-08 18:36:31
【问题描述】:
所以我可以想出几种方法来做到这一点,但我觉得我只是在为每个新的子类重新输入相同的东西。有没有一种设计模式可以让我为我的子类设置完整的结构,从而减少实现所需的代码量(如果可能的话,还可以强制执行正确的实现?)
这看起来很简单,但我的想法不起作用,我发现最好的方法是在调用构造函数时在参数中硬编码,或者在每个子类中设置新常量然后使用那些.
我目前拥有的是这样的:
"parent.hpp"
class Parent {
private:
std::string name;
int someValue;
protected:
Parent(std::string name, int someValue); // NOTE: There will be 7 parameters/attributes that need initial base values
void setName(std::string name) { this->name = name; }
void setSomeValue(int someValue) { this->someValue = someValue; }
public:
std::string getName() { return this->name; }
int getSomeValue() { return this->someValue; }
};
"parent.cpp"
Parent::Parent(std::string name, int someValue) {
setName(name);
setSomeValue(someValue);
}
"child.hpp"
class Child : public Parent {
public:
Child();
};
"child.cpp - option 1"
static const std::string DEFAULT_NAME = "Jon";
static const int DEFAULT_SOME_VALUE = 100;
Child::Child() : Parent(DEFAULT_NAME, DEFAULT_SOME_VALUE) {
// other stuff if needed
}
"child.cpp - option 2"
Child::Child() : Parent("Jon", 100) {
// other stuff if needed
}
会有虚拟方法,我稍后会添加,但现在我只想知道正确的设计模式(可能)有很多子类。还有更多共同的参数都是 int 值。我似乎不清楚将构造函数设为Child::Child("string", 1, 2, 3, 4, 5, 6),尽管实现新的子类会更容易。
另一方面,如果我只是为每个子类中的基值重新键入样板常量,则构造函数将更具描述性,但会有很多代码重用。
在我看来,我想做的是在父类中拥有虚拟受保护常量,子类需要定义这些常量,然后从构造函数中调用它们,但这是不允许的。两种选择中的一种更好吗?有没有更好的“长期”设置?
我查看了所有类似的问题,发现最接近的是:Proper way to make base class setup parent class。虽然我不确定这个想法是否能解决我的问题或让任何事情变得更清晰。
我的另一个想法是从默认构造函数中调用纯虚方法,但据我所知,这也是不允许的。
【问题讨论】:
-
我想我对
static const std::string DEFAULT_NAME = "Jon"; static const int DEFAULT_SOME_VALUE = 100;感到困惑。这只是一个例子,还是你真的在考虑硬编码常量值?除了那种情况,这不会让你的代码毫无用处吗?? -
这只是一种为不同参数提供上下文的方法。每个不同的子类都需要实现常量,然后所有的构造函数都将使用相同的变量。例如
Child:Parent(NAME, AGE, WEIGHT, HEIGHT)与Child:Parent("Jim", 30, 176, 90)
标签: c++ polymorphism