- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我可以想出几种方法来做到这一点,但我觉得我只是在为每个新的子类重新键入相同的内容。是否有一种设计模式可以让我为我的子类设置完整的结构,从而减少实现所需的代码量(并在可能的情况下强制执行正确的实现?)
这看起来很简单,但我的想法行不通,我发现最好的方法是在调用构造函数时在参数中进行硬编码,或者在每个子类中设置新常量然后使用它们.
我目前拥有的是这样的:
"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 .虽然我不确定这个想法是否会解决我的问题或让任何事情变得更清楚。
我的另一个想法是从默认构造函数调用纯虚方法,但据我所知,这也是不允许的。
最佳答案
我会像 Ami 一样使用另一个对象来保持状态,尽管我会出于不同的原因这样做。由于状态是一个单独的类,您可以在构造实际的 Parent 和 Child 之前完全构造它,并且它可以有自己的层次结构。
标题
class Parent {
protected:
struct ParentState {
std::string name;
int someValue;
};
Parent(ParentState);
void setName(std::string name) { data.name = name; }
void setSomeValue(int someValue) { data.someValue = someValue; }
public:
std::string getName() { return data.name; }
int getSomeValue() { return data.someValue; }
private:
ParentState data;
};
class Child : public Parent {
struct ChildDefaults : public Parent::ParentState {
ChildDefaults();
};
public:
Child();
};
实现
Parent::Parent(ParentState init) {
// since you have setters, they should be used
// instead of just data=init;
setName(init.name);
setSomeValue(init.someValue);
}
Child::ChildDefaults::ChildDefaults(){
name = "Jon";
someValue = 100;
}
Child::Child() : Parent(ChildDefaults()){
// other stuff if needed
}
如果将 ParentState 和 ChildDefault 类放在一个单独的文件中,则可以使用该文件将所有默认值放在一个位置,以便您轻松查找或更改它们。如果它们没有隐藏在类中,强制使用额外的作用域语法,它们也可能会更漂亮。
附录:要将整个默认设置层次结构放在自己的标题中,只需将它们全部移动到一个标题中即可。请务必进行包含保护以避免多次定义构造函数。
#ifndef THE_DEFAULTS_H
#define THE_DEFAULTS_H
struct ParentState {
std::string name;
int someValue;
};
struct ChildDefaults : public Parent::ParentState {
ChildDefaults() {
name = "Jon";
someValue = 100;
}
};
// more default settings for other classes
#endif
关于c++ - 具有共同属性但不同值的派生类的正确设计设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130669/
所以,我有一个类似于 this one 的用例,但我觉得有一些额外的细节值得提出一个新问题。 ( related questions ,供引用) 我正在编写一个实现 a cycle 的数据结构.基本设
我正在使用 Django 编写一个社交网络应用程序,需要实现类似于 Facebook“Mutual Friends”概念的功能。我有一个像这样的简单模型: class Friend(models.Mo
我有一个 iOS 应用程序,用户可以在其中使用 Facebook 登录并授予 user_friends 权限。从 Graph API 2.0 开始,Facebook 声称你无法获取两个人之间所有的共同
我想知道将来对我来说最简单的方法是什么,可以使查询既有效又不那么复杂。 我应该像这样保存双向关系吗 from_id=1, to_id=2from_id=2, to_id=1 或者只创建一个唯一的行 f
我是一名优秀的程序员,十分优秀!