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

C#におけるオーバーライドとメソッドの非表示(シャドウイング)の違いとは?

C#におけるオーバーライドとメソッドの非表示(シャドウイング)の違い

C#では、継承関係にあるクラス同士で同じ名前のメソッドを扱う方法として、「オーバーライド(override)」と「メソッドの非表示(シャドウイング)」という2つのアプローチがあります。どちらも親クラスのメソッドを子クラスで再定義する点は似ていますが、その仕組みや実際の挙動には明確な違いがあります。

メソッドの非表示(シャドウイング)とは

メソッドの非表示は、「シャドウイング(shadowing)」とも呼ばれる手法です。この場合、子クラスは override キーワードを使わずに、親クラスと同じ名前のメソッドを独自に定義できます。通常は new キーワードを付けて宣言し、子クラスはその関数について自分専用のバージョンを持つことになります。

シャドウイングの特徴は、メソッド全体(完全な定義)が再定義される点です。

オーバーライドとは

オーバーライドは、サブクラス固有の振る舞いを定義するための仕組みです。子クラスは、親クラスで宣言されたメソッドを、自身の要件に合わせて実装し直すことができます。オーバーライドでは、メソッドの実装部分だけが再定義され、メソッド名や引数などのシグネチャは親クラスと同一である必要があります。

コード例で確認する

using System;

class Parent
{
    public virtual void Show()
    {
        Console.WriteLine("親クラスのShowメソッド");
    }
}

class Child : Parent
{
    // オーバーライド:実装だけを差し替える
    public override void Show()
    {
        Console.WriteLine("子クラスでオーバーライドしたShowメソッド");
    }

    // シャドウイング:newキーワードで別バージョンを定義
    public new void Display()
    {
        Console.WriteLine("子クラスで隠したDisplayメソッド");
    }
}

class Program
{
    static void Main()
    {
        Parent obj = new Child();
        obj.Show(); // 出力:子クラスでオーバーライドしたShowメソッド
    }
}

この例のように、オーバーライドされたメソッドは、親クラス型の変数に子クラスのオブジェクトを代入しても、子クラス側の実装が呼び出されます。これはポリモーフィズム(多態性)が働いているためです。

アクセスの違い

オーバーライドの場合、子クラスのオブジェクトを通じて、オーバーライド後のメソッド内から base キーワードを使って親クラスの元の実装にアクセスすることもできます。一方、シャドウイングでは、親クラス型の参照からは子クラス側で隠したメソッドにアクセスできず、呼び出されるメソッドは参照の型によって決まります。

主な違いのまとめ

  • キーワード: オーバーライドは override、シャドウイングは 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} >>&