我有一个A
看起来像的抽象类
class A {
public:
virtual vector<char> marshall() = 0;
virtual void unmarshall(vector<char> raw) = 0;
};
继承自的类A
会覆盖这两种方法:特别是会unmarshall
改变子类的内部状态。
例如
class B : public A {
int someImportantInt;
vector<char> marshall() {
vector<char> r;
r.push_back(someImportantInt);
return r;
}
void unmarshall(vector<char> raw) {
someImportantInt = raw[0];
}
};
B
现在,我认为突变是邪恶的,另外我们必须实例化,然后才调用的事实unmarhsall
看起来像代码味道。
一种选择是有一个带有 a 的构造函数vector<char>
,但我不知道有一种方法可以强制子类这样做。
编辑:
umarshall
构造方法的动机是 B 的状态一旦被调用就不会改变。因此,我们可以将其从构造函数中移除unmarshall
并A
替换为B
带有vector<char>
.
IE
class B : public A {
int someImportantInt;
B(const vector<char>& raw) : someImportantInt(raw[0]) {}
vector<char> marshall();
}
正如我所看到的,这里的问题是没有强制子类声明一个接受vector<char>
.
我在这里有什么选择?