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

C#入門:オーバーライドとシャドウイングの違いをわかりやすく解説

C#のオブジェクト指向プログラミングでは、親クラス(基底クラス)のメソッドを子クラス(派生クラス)で再定義する方法として、「オーバーライド」と「シャドウイング」の2つの手法があります。どちらも同じ名前のメソッドを子クラス側で定義しますが、その仕組みと挙動には重要な違いがあります。

オーバーライド(Overriding)とは

オーバーライドでは、サブクラスの型に固有の動作を定義できます。つまり、子クラスは親クラスのメソッドを、自身の要件に合わせて再実装することが可能です。これにより、ポリモーフィズム(多態性)を実現できます。

オーバーライドを使用するには、親クラス側のメソッドに virtual または abstract キーワードを付け、子クラス側では override キーワードを付けてメソッドを再定義します。

以下は、抽象クラスを使ってオーバーライドを実装した例です。

コード例

using System;

namespace PolymorphismApplication {
    abstract class Shape {
        public abstract int area();
    }

    class Rectangle: Shape {
        private int length;
        private int width;

        public Rectangle( int a = 0, int b = 0) {
            length = a;
            width = b;
        }

        public override int area () {
            Console.WriteLine("Rectangle class area :");
            return (width * length);
        }
    }

    class RectangleTester {
        static void Main(string[] args) {
            Rectangle r = new Rectangle(10, 7);
            double a = r.area();
            Console.WriteLine("Area: {0}",a);
            Console.ReadKey();
        }
    }
}

この例では、抽象クラス Shape の抽象メソッド area() を、Rectangle クラスが override キーワードを使って独自に実装しています。実行すると「Rectangle class area :」と表示され、幅×長さで計算された面積が返されます。

シャドウイング(Shadowing)とは

シャドウイングは「メソッドの隠ぺい(メソッドハイディング)」とも呼ばれる機能です。シャドウイングでは、override キーワードを使わずに、親クラスと同じ名前のメソッドを子クラスで定義できます。子クラスは、同名の関数について独自のバージョンを持つことになります。

シャドウイングを行うには、new キーワードを使用して、基底クラスの関数に対する独自の実装を作成します。

コード例

using System;
using System.Collections.Generic;

class Demo {
    public class Parent {
        public string Display() {
            return "Parent Class!";
        }
    }
    
    public class Child : Parent {
        public new string Display() {
            return "Child Class!";
        }
    }

    static void Main(String[] args) {
        Child child = new Child();
        Console.WriteLine(child.Display());
    }
}

この例では、Child クラスが new キーワードを使って Display() メソッドを隠ぺいしています。Child 型の変数から呼び出すと「Child Class!」が出力されます。

オーバーライドとシャドウイングの違いまとめ

項目オーバーライドシャドウイング
使用するキーワードoverride(親側は virtual / abstractnew
ポリモーフィズム対応(親型の変数でも子の実装が呼ばれる)非対応(変数の宣言型によって呼び出しが変わる)
主な用途継承階層での動作の差し替え基底クラスのメンバーを意図的に隠す

継承関係の中で一貫した多態的な振る舞いが必要な場合はオーバーライドを、単に基底クラスの実装を隠したい場合にはシャドウイングを選ぶのが基本です。

  1. C#のConsoleクラスとは?主要プロパティの使い方を実例付きで解説

    C#のConsoleクラスは、コンソールアプリケーションにおける標準入力・標準出力・標準エラー出力の各ストリームを表すクラスです。テキストの表示や入力の読み取りだけでなく、文字色や背景色の変更、カーソル位置やサイズの制御など、コンソール操作に関するさまざまな機能が提供されています。ここでは、Consoleクラスの代表的なプロパティの使い方を、サンプルコードと実行結果とあわせて解説します。Console.CursorLeftプロパティコンソール上のカーソル位置(左端から数えた列位置)を変更するには、Console.CursorLeftプロパティを使用します。サンプルコードusing System

  2. Javaのメソッドオーバーライドとは?仕組みとサンプルコードを解説

    オーバーライドとはオーバーライド(Override)とは、サブクラスが親クラスから継承したメソッドを、自身の要件に合わせて再定義できる機能です。これにより、サブクラスはその型に固有の振る舞いを実装することができます。オブジェクト指向の観点で言えば、オーバーライドとは「既存のメソッドの機能を上書きする」ことを意味します。オーバーライドの例具体的な例を見てみましょう。以下のコードでは、Animal クラスの move() メソッドを、Dog クラスがオーバーライドしています。class Animal {    public void move() {&nbs