0Pricing
C# Academy · レッスン

ポリモーフィズムと動的ディスパッチ

ポリモーフィズムを理解します。基底クラス型の参照からvirtualメンバーを呼び出し、基底クラス型のコレクションを使い、メソッド隠蔽を避け、必要に応じて安全にキャストします。

「ポリモーフィズムと動的ディスパッチ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

ポリモーフィズムの概要

目標:1つの基底型を使い、派生型に動作をカスタマイズさせます。

  • 基底クラスの参照と派生クラスのオブジェクト
  • virtual + override → 動的ディスパッチ
  • 基底型のコレクション
  • newによるメソッド隠蔽を避けます

動的ディスパッチの基本

virtualメソッドの呼び出しでは、変数のコンパイル時型ではなく、オブジェクトの実行時型が使用されます。

using System;

public class Animal
{
  public virtual string Speak() { return "???"; }
}

public class Cat : Animal
{
  public override string Speak() { return "Meow"; }
}

public class Dog : Animal
{
  public override string Speak() { return "Woof"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Animal a1 = new Cat(); // base reference
    Animal a2 = new Dog();
    Console.WriteLine(a1.Speak()); // Meow
    Console.WriteLine(a2.Speak()); // Woof
  }
}

コレクションでのポリモーフィズム

異なる派生型をList<Base>に格納し、virtual メンバーを同じ方法で呼び出せます。

using System;
using System.Collections.Generic;

public class Shape
{
  public virtual double Area() { return 0.0; }
}

public class Rectangle : Shape
{
  private readonly int _w, _h;
  public Rectangle(int w, int h) { _w = w; _h = h; }
  public override double Area() { return _w * _h; }
}

public class Circle : Shape
{
  private readonly int _r;
  public Circle(int r) { _r = r; }
  public override double Area() { return 3.14159 * _r * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Rectangle(3, 4));
    shapes.Add(new Circle(2));

    foreach (Shape s in shapes)
    {
      Console.WriteLine("Area = " + s.Area()); // calls correct override
    }
  }
}

隠蔽と override の比較

メソッドの隠蔽(new)は避けてください。本当のポリモーフィズムにはoverrideを使用します。隠蔽では、基底クラスの参照を通じて呼び出すと基底クラスのバージョンが呼び出されます。

using System;

public class Printer
{
  public virtual void Print() { Console.WriteLine("[Base]"); }
}

public class LoudPrinter : Printer
{
  public override void Print() { Console.WriteLine("[LOUD]"); }
}

public class HiddenPrinter : Printer
{
  // Hides the base method instead of overriding (BAD fit for polymorphism)
  public new void Print() { Console.WriteLine("[HIDDEN]"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Printer a = new LoudPrinter();
    Printer b = new HiddenPrinter();

    a.Print(); // [LOUD]  (override works)
    b.Print(); // [Base]  (hiding fails via base reference)
  }
}

安全なキャスト(as + チェック)

基底クラスのメソッドや virtual メソッドの呼び出しを優先します。派生クラス固有のメンバーを使う必要がある場合は、安全にキャストします(as + null チェック)。

using System;

public class Vehicle
{
  public virtual string Info() { return "Vehicle"; }
}

public class Car : Vehicle
{
  public bool HasAirConditioning;
  public override string Info() { return "Car"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Vehicle v = new Car();
    Console.WriteLine(v.Info()); // polymorphic call

    // Need a Car-only member? Cast carefully using 'as'
    Car c = v as Car;
    if (c != null)
    {
      c.HasAirConditioning = true;
      Console.WriteLine("AC set: " + c.HasAirConditioning);
    }
    else
    {
      Console.WriteLine("Not a Car");
    }
  }
}

ポリモーフィズムのヒント

ヒント:

  • まず基底クラスや virtual メソッドの呼び出しを中心に設計します。
  • 動作を変更するにはnewではなくoverrideを使用します。
  • 基底クラスの API は小さく安定させます。
  • キャストはなるべく避け、ポリモーフィズムやインターフェイスを優先します。

動的ディスパッチの意味

C# における動的ディスパッチとは何でしょうか?

まとめ

まとめ:ポリモーフィズムにより、1つの基底クラスからvirtual/overrideを通じてさまざまな派生クラスの動作を呼び出せます。基底型のコレクションを使用し、newによる隠蔽を避け、必要な場合にだけキャストします。

よくある質問

「ポリモーフィズムと動的ディスパッチ」レッスンは無料ですか?

はい。「ポリモーフィズムと動的ディスパッチ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「ポリモーフィズムと動的ディスパッチ」で何を学びますか?

ポリモーフィズムを理解します。基底クラス型の参照からvirtualメンバーを呼び出し、基底クラス型のコレクションを使い、メソッド隠蔽を避け、必要に応じて安全にキャストします。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「ポリモーフィズムと動的ディスパッチ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. virtual/override/sealedとabstractクラス
  2. インターフェース(入門)と複数インターフェースの実装
  3. ポリモーフィズムと動的ディスパッチ
← C# Academyに戻る