動的言語のバックグラウンドがあるため、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);