次の例のように、クラスの型を定義するいくつかの列挙を有するクラスが与えられる:特定のメンバ変数の値とクラスの特殊タイプを作成
class Fruit {
public:
enum class FruitType {
AppleType = 0,
OrangeType = 1,
BananaType = 2,
};
Fruit(FruitType type) : type_(type) {}
FruitType fruit_type() const { return type_; }
private:
FruitType type_;
};
と同一を共有することから派生したクラスを列挙:
class DriedFruit : public Fruit {
public:
// Some Dried specific methods.
};
何とか特定の列挙値の各々と果物とDriedFruitための異なるタイプを定義することも可能である:
class Apple // Fruit with FruitType = AppleType
class Orange // Fruit with FruitType = OrangeType
class Banana // Fruit with FruitType = BananaType
class DriedApple // DriedFruit with FruitType = AppleType
class DriedOrange // DriedFruit with FruitType = OrangeType
class DriedBanana // DriedFruit with FruitType = BananaType
の3つのクラスがあり、Apple、Orange、Bananaの3つのクラスが区別され、3つのクラスDriedApple、DriedOrange、DriedBananaは異なるタイプです。
私の質問は、クラスの型の情報を明示的にクラスのenumメンバ変数として格納し、すべての個別の型に対して共通の基本クラスを持つことを除いて、How to define different types for the same class in C++と多少似ています。
これを行う最も効率的な方法は何でしょうか?
EDIT: 主な使用例は次のとおりです。私のアプリケーションでは、Appleが入力としてしか期待していない、またはオレンジを入力として期待する特定の方法があります。 。
アップルが期待している方法にフルーツを渡すのは不安ですが、同時に3つの異なる種類があることも気にしない多くの方法があります。 は、それがアップルである場合、アップル型をコンクリートに果実から変換 いくつかの時点で、次いで、フルーツとしてその周りに、いくつかの入力パラメータから次に パスフルーツを構築し、処理する次のよう
メインワークフローでありますそれをさらに処理し、その時点からAppleにタイプを制限します。
あなたがリンクしている質問への回答は、この質問に答えませんか? –
'type_'をprotectedにして、それぞれの派生クラスにコンストラクタで適切に設定されていることに何か間違っていますか? – zzxyz
これは少しのXY問題に見えます。あなたは本当に 'フルーツ'の特定のインスタンスのための_distinct types_を持つ必要がありますか?共通クラスに実装された特殊なインターフェース?後者は設計上の瑕疵として匂いがする。 – user0042