【C#】共変性をわかりやすく
共変性(covariance)とは、簡単に言うと「大きな箱の中に小さな箱が入る」ということです。
例えば、あなたがおもちゃの箱を持っていて、その中にいろいろなおもちゃが入っているとします。ここで、おもちゃの箱は「動物のおもちゃの箱」としましょう。この箱には、犬のおもちゃ、猫のおもちゃ、鳥のおもちゃなどが入っています。
共変性があるというのは、この「動物のおもちゃの箱」をもっと広い意味での「おもちゃの箱」として扱えるということです。つまり、犬のおもちゃだけの箱、猫のおもちゃだけの箱も、「おもちゃの箱」として扱うことができます。
C#のプログラミングにおいて、共変性は似たようなことを表します。例えば、「動物」というクラス(箱)があったとして、「犬」と「猫」はその「動物」クラスのサブクラス(小さい箱)です。共変性があると、これらのサブクラスをそのまま「動物」として扱うことができるのです。
これは、プログラムが柔軟になり、いろいろな種類のデータを扱いやすくなるため、非常に便利な機能です。
サンプルコード
共変性を説明するためのC#の簡単なサンプルコードを紹介します。
想像してみてください。私たちが動物園を作っていて、様々な動物を見せたいと思っています。動物園には、「動物」の種類がいろいろありますが、「猫」や「犬」もその中の一部です。
まず、基本的な「動物」クラスを作ります。そして、「猫」と「犬」は「動物」の特定の種類としてクラスを作ります。
// 基本の動物クラス
public class Animal { }
// 動物のサブクラスとしての猫
public class Cat : Animal { }
// 動物のサブクラスとしての犬
public class Dog : Animal { }
次に、動物のリストを表示する簡単なメソッドを作ります。このメソッドは「動物」のリストを受け取り、それぞれの動物を表示します。
public void DisplayAnimals(IEnumerable<Animal> animals)
{
foreach (var animal in animals)
{
Console.WriteLine(animal.GetType().Name);
}
}
共変性を使うと、このメソッドは「猫」や「犬」のリストも受け入れることができます。これは、猫や犬は動物なので、動物のリストとして扱うことができるからです。
メインメソッドでこれをテストしてみましょう。(トップレベルステートメントを採用しているためMainメソッドは表示されていません)
var animals = new List<Animal> { new Cat(), new Dog() };
var cats = new List<Cat> { new Cat(), new Cat() };
var dogs = new List<Dog> { new Dog(), new Dog() };
// 動物のリストを表示
DisplayAnimals(animals);
// 共変性のおかげで、猫のリストも動物のリストとして扱える
DisplayAnimals(cats);
// 同様に、犬のリストも動物のリストとして扱える
DisplayAnimals(dogs);
void DisplayAnimals(IEnumerable<Animal> animals)
{
foreach (var animal in animals)
{
Console.WriteLine(animal.GetType().Name);
}
}
// 基本の動物クラス
public class Animal { }
// 動物のサブクラスとしての猫
public class Cat : Animal { }
// 動物のサブクラスとしての犬
public class Dog : Animal { }
この例では、DisplayAnimalsメソッドは元々Animalのリストを期待していますが、共変性によりCatやDogのリストも受け入れることができます。これが共変性の基本的な使い方です
実行結果
CatとDogはAnimalのサブクラスですが、実際のオブジェクトはCatとDogのインスタンスです。そのため、GetType().Nameは実際のサブクラスの名前を出力します。
Cat
Dog
次に、Catのリスト(cats)を処理します。共変性により、これらはAnimalとして受け入れられ、それぞれCatとして表示されます。
Cat
Cat
最後に、Dogのリスト(dogs)を処理します。これも共変性によりAnimalとして受け入れられ、それぞれDogとして表示されます。
Dog
Dog
この結果は、共変性がどのように動作するかを示しています。Animal型のメソッドにCatやDogのリストを渡すことができ、それらは適切に扱われます







ディスカッション
コメント一覧
まだ、コメントがありません