来自我的动态语言背景,我发现我在用静态类型语言(如 C++)表达我的意图时遇到了问题。
我正在为我的应用程序设计一个偏好系统。由于每个首选项都会有一些关联的值(默认值、限制、观察者函数......),我决定将每个首选项封装在它自己的对象中。这是我的初稿:
class Preference // purely abstract class
{
parseFromString(String s) = 0;
get() = 0;
void set(newVal) = 0;
private:
// internal data
};
现在我需要创建一些派生类,IntPreference
例如FloatPreference
和StringPreference
。以下是他们的声明的样子:
class IntPreference : Preference class StringPreference : Preference
{ {
int parseFromString(String s); String parseFromString(String s);
void set(int newVal); void set(String newVal);
// etc. // etc.
} }
既然该set()
方法接受了int
类中的参数和 中IntPreference
的String
参数StringPreference
,则无法在基类中声明此函数。的返回值也是如此parseFromString()
。我知道这在 C++ 中是不可能的,因为派生类中具有相同名称和不同参数类型的函数只会掩盖而不是覆盖它们的祖先。同样,这就是我用动态语言表达自己的方式,C++ 中的正确模式是什么?
编辑:对不起,我忘了提到我需要一个基类将它们全部存储在哈希表中:
Hash(const char *name, Preference pref);