ジェネリックの質問(型パラメーターとコンストラクター)
質問
次のように、単一クラスの果物の重みをfloats / doubleに個別に保存するカスタムコレクションクラスがある場合:
1.1, 3.3, 6.6, 4.4, ...
フロートかダブルかを指定し、フルーツの種類を区別する必要がある場合、次のようにするのが良いでしょう:
enumの使用:
FruitList<float, FruitType.Orange>
または
コンストラクターで列挙型を使用する:
FruitList<float> (FruitType.Orange)
または
クラスの使用:
FruitList<float, Orange>
または
コンストラクターでクラスを使用する:
FruitList<float> (Orange)
私を混乱させるのは、<!> lt; <!> gt;でこれらの種類のものを指定する意味があるかどうかです。エリア(そのエリアの名前がわからない)?
より良い、より速く、より効率的な実践はどれですか
ところで、オレンジクラスはどこでも使用されることはありません。
編集:これは単なる例であり、実際の例ではありませんが、これは明確な方法で反映されています。すべてがfloat / doubleであり、他のメソッドに渡されるように。しかし、メソッドはどのタイプの果物を正しく実行するかを知る必要があります。果物自体は何の意味もありません。
解決
まず、列挙値は型ではないため、例
FruitList<float, FruitType.Orange>
動作しません。汎用リストがOrange
に静的に入力されるようにする場合は、このリストを使用する必要があります
FruitList<float, Orange>
<=>クラスを使用することはありませんが、。私が見るように、変数名で型を伝えることができるので、おそらく必要はありません:
FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange);
他のヒント
FruitList<float>(FruitType.Orange)
がおそらく進むべき道です。
float
は、型パラメーター以外にはできません。
果物の種類は単なるプロパティです。別の型を作成し、それに型パラメーターを使用することは意味がありません。
オレンジは、タグのように...色...のようになります。車は青でも赤でも、<!> quot;同じ<!> quot;車。オレンジで何か特別なこと、普通の果物やリンゴとは違うことをできるようにしたい場合は、抽象的なFruitクラスとサブクラスOrangeを作成し、<!> lt; <!> gtを使用します;事。色のようなタグだけの場合、enumはうまくいくと思います。
クラス/構造体を使用すると、型チェックなどを行う方が簡単だと思います。たとえば、誰かがあなたの果物リストにリンゴの種類の果物を追加しようとしたらどうなりますか?オレンジになりますか?果物の種類がオレンジ色かどうかを確認する必要がありますか?そうでない場合はどうなりますか? argumentexception?
クラスに行って<!> lt; <!> gt;ものすごい。しかし、それは私です。実際、それが私だったら、先に進み、測定する必要のある重量やその他すべてにdecimal
を使用していたと思います... ):
class FruitList<TFruit> where TFruit : Fruit {}
abstract class Fruit {public abstract decimal Weight {get; protected set; }}
class Orange : Fruit { ... }