【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
のリストを渡すことができ、それらは適切に扱われます
ディスカッション
コメント一覧
まだ、コメントがありません