gpt4 book ai didi

c++ - 避免重写方法中的突变

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:55 27 4
gpt4 key购买 nike

我有一个抽象类 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看起来像代码的味道。

一个选择是让构造函数接受 vector<char> ,但我不知道有什么方法可以强制 children 这样做。

编辑:

构造器方法的动机是 B 的状态一旦 umarshall 就不会改变。已被调用。所以我们可以删除 unmarshall来自 A并将其替换为 B带有一个接受 vector<char> 的构造函数.

class B : public A {
int someImportantInt;

B(const vector<char>& raw) : someImportantInt(raw[0]) {}
vector<char> marshall();
}

如我所见,这里的问题是没有契约强制子类声明一个接受 vector<char> 的构造函数。 .

我有哪些选择?

最佳答案

您可以使用模板 Marshaller 类来执行编码和解码。然后在类中使用类型为 Marshaller 的数据成员,而不仅仅是 int。然后在 Marshaller 的构造函数中,您将初始化一个 vector 成员,因此没有类需要知道它。像这样:

template <class T>
class Marshaller {
T real_data;
vector<char> marshalled_data;
Marshaller ();
Marshaller (Marshaller&);
public:
Marshaller (T& t) :real_data(t) {
// Do whatever with marshalled_data.
}
void marshall () {
// Fill me in.
}
void unmarshall () {
// Fill this in.
}
vector<char> rawData () {
return marshalled_data;
}
bool isMarshalled () {
return marshalled_data.size() > 0;
}
T& data () {
return real_data;
}
};

class B {
Marshaller<int> someImportantInt;
public:
B () :someImportantInt(0) {}
B (int i) :someImportantInt(i) {}
int getImportantInt () {
return someImportantInt.data();
}
vector<char> getRawInt () {
return someImportantInt.raw data();
}
void unmarshall () {
someImportantInt.unmarshall();
}
};

我希望你能充分理解这个想法,从而给你一个起点。您可以向 Marshaller 添加更多函数来处理诸如 operator=() 之类的数据何时被编码的事情。我不知道从这一点去哪里,因为我不确定你想要什么。这是我最好的猜测,当然您可以自由修改它。

关于c++ - 避免重写方法中的突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17475658/

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