C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#におけるオーバーライドとシャドウイングの違いを徹底解説

C#では、継承関係にあるクラス間でメソッドを再定義する手段として、「オーバーライド(override)」と「シャドウイング(shadowing)」の2つがあります。どちらも親クラスのメソッドを子クラスで再定義する機能ですが、動作の仕組みや用途はまったく異なります。本記事では、両者の違いを具体例とともにわかりやすく解説します。

オーバーライドとシャドウイングの主な違い

1. 再定義される範囲が異なる

シャドウイングはメソッド全体を新しく定義し直すのに対し、オーバーライドは親クラスで宣言されたメソッドの実装部分のみを差し替える仕組みです。

2. ポリモーフィズム(多態性)の挙動が異なる

オーバーライドされたメソッドは、子クラスのオブジェクトを基底クラス型の変数に代入して呼び出した場合でも、実際のオブジェクトの型(子クラス)のメソッドが実行されます。
一方、シャドウイングでは、基底クラス型の参照からメソッドを呼び出すと、子クラスで定義したメソッドにはアクセスされず、基底クラス側のメソッドが実行されます。これが両者を区別する最も重要なポイントです。

3. シャドウイングは「メソッドハイディング」とも呼ばれる

シャドウイングは別名「メソッドの隠ぺい(method hiding)」と呼ばれます。シャドウイングでは override キーワードを使わずに、親クラスと同じシグネチャのメソッドを子クラスに定義できます。このとき、子クラスは同名のメソッドの独自バージョンを持つことになります。

4. サブクラス固有の振る舞いを定義できるのはオーバーライド

オーバーライドを使用すると、サブクラスの型に固有の振る舞いを柔軟に定義できます。つまり、サブクラスは自身の要件に応じて、親クラスのメソッドを自由に実装し直すことが可能です。

コード例で見る違い

オーバーライドの例

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("動物が鳴きます");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("ワン!");
    }
}

Animal animal = new Dog();
animal.Speak(); // 出力:ワン! (子クラスのメソッドが呼ばれる)

シャドウイングの例

public class Animal
{
    public void Speak()
    {
        Console.WriteLine("動物が鳴きます");
    }
}

public class Dog : Animal
{
    public new void Speak()
    {
        Console.WriteLine("ワン!");
    }
}

Animal animal = new Dog();
animal.Speak(); // 出力:動物が鳴きます (親クラスのメソッドが呼ばれる)
Dog dog = new Dog();
dog.Speak();    // 出力:ワン!

比較表で整理する

項目オーバーライドシャドウイング
使用するキーワードvirtual / overridenew
再定義の範囲メソッドの実装のみメソッド全体
ポリモーフィズム有効(実際の型のメソッドが呼ばれる)無効(参照の型のメソッドが呼ばれる)
別名メソッドハイディング
主な用途サブクラスごとの固有の振る舞いの実装親クラスのメソッドを意図的に隠したい場合

まとめ

オーバーライドはポリモーフィズムを実現するための正式な仕組みであり、親クラスの実装を子クラスの要件に合わせて置き換えたい場合に使用します。一方、シャドウイングは new キーワードによるメソッドの隠ぺいであり、親クラスのメソッドを完全に別のものとして定義し直したい場合に使われます。設計の意図に応じて、適切な手法を選択することが重要です。

  1. C#のクラスとオブジェクトの違いとは?基本概念とサンプルコードでわかりやすく解説

    クラスとオブジェクトの基本的な違いC#におけるクラスとは、あるデータ型の設計図(ブループリント)を定義するものです。クラス自体はあくまで「型」の定義であり、それ単体ではメモリ上に実体を持ちません。一方、オブジェクトは、そのクラスをもとに生成された実体(インスタンス)を指します。クラスを構成するメソッドや変数は、まとめて「クラスのメンバー」と呼ばれます。ドット演算子でメンバーにアクセスするクラスのメンバーにアクセスするには、オブジェクト名の後にドット(.)演算子を付けます。ドット演算子は、オブジェクト名とメンバー名をつなぐ役割を果たします。まず、newキーワードを使ってクラスからオブジェクトを生

  2. Pythonのセット演算入門|演算子とメソッドの違いを徹底解説

    Pythonのセット(set)は、重複しない要素を管理するための組み込みデータ型です。和集合・積集合・差集合・対称差といった集合演算は、対応するメソッドを呼び出す方法と演算子を使う方法の2通りで実行できます。この記事では、それぞれの具体的な書き方と、両者の違いについて解説します。 和集合(Union) union() メソッドを使う場合 >>> s1 = {1, 2, 3, 4, 5} >>> s2 = {4, 5, 6, 7, 8} >>> s1.union(s2) {1, 2, 3, 4, 5, 6, 7, 8} >>&