【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のリストを期待していますが、共変性によりCatDogのリストも受け入れることができます。これが共変性の基本的な使い方です

実行結果

CatDogAnimalのサブクラスですが、実際のオブジェクトはCatDogのインスタンスです。そのため、GetType().Nameは実際のサブクラスの名前を出力します。

Cat
Dog

次に、Catのリスト(cats)を処理します。共変性により、これらはAnimalとして受け入れられ、それぞれCatとして表示されます。

Cat
Cat

最後に、Dogのリスト(dogs)を処理します。これも共変性によりAnimalとして受け入れられ、それぞれDogとして表示されます。

Dog
Dog

この結果は、共変性がどのように動作するかを示しています。Animal型のメソッドにCatDogのリストを渡すことができ、それらは適切に扱われます

C#,学習

Posted by hidepon