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

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


オーバーライド(Overriding)

オーバーライドとは、継承関係にある親クラスのメソッドを、子クラス側で上書きして再定義する仕組みです。これにより、サブクラスはその型に固有の振る舞いを定義でき、親クラスのメソッドを自分の要件に合わせて実装し直すことができます。

C#でオーバーライドを行うには、親クラス側のメソッドに 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クラスの面積:");
            return (width * length);
        }
    }

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

この例では、抽象クラス Shapearea() メソッドを、Rectangle クラスが override キーワードを使って具体的な面積計算として実装しています。実行すると「Rectangleクラスの面積:」と表示され、計算結果の 70 が出力されます。

メソッドの隠ぺい(Method Hiding/シャドウイング)

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

メソッドの隠ぺいを行うには、new キーワードを使用します。これにより、意図的に親クラスのメソッドを隠していることをコンパイラに明示でき、警告の発生を防ぐことができます。

以下に例を示します。

コード例

using System;
using System.Collections.Generic;

class Demo {
    public class Parent {
        public string Display() {
            return "親クラスです!";
        }
    }

    public class Child : Parent {
        public new string Display() {
            return "子クラスです!";
        }
    }

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

このプログラムを実行すると「子クラスです!」と表示されます。Child 型の変数経由で呼び出したため、Child クラス側の Display() メソッドが実行されるのです。

オーバーライドとメソッドの隠ぺいの主な違い

  • 使用するキーワード: オーバーライドは virtualabstractoverride の組み合わせが必要ですが、メソッドの隠ぺいでは new を使用します。
  • 呼び出されるメソッドの決まり方: オーバーライドでは、実行時の実際のオブジェクトの型に基づいてメソッドが選択されます(ポリモーフィズム)。一方、メソッドの隠ぺいでは、コンパイル時の参照の型に基づいて呼び出されるメソッドが決まります。
  • 基底クラス型の変数からアクセスした場合: 隠ぺいされたメソッドを基底クラス型の変数から呼び出すと、親クラス側の実装が実行されます。オーバーライドされたメソッドであれば、常に派生クラス側の実装が呼び出されます。
  1. メソッドと関数の違いとは?JavaScriptのサンプルコードでわかりやすく解説

    メソッドと関数は同じもの?結論から言うと、メソッド(method)と関数(function)は本質的に同じものであり、呼び方が異なるだけです。オブジェクト指向プログラミングの世界では、プロシージャや関数のことを「メソッド」と呼ぶのが一般的です。関数とは何か関数とは、プログラム内のどこからでも呼び出すことのできる、再利用可能なコードのまとまりです。同じ処理を何度も書き直す必要がなくなるため、コードの重複を防ぎ、プログラマーがモジュール化された読みやすいコードを書く上で大きな助けとなります。JavaScriptにおける関数の基本構文以下は、JavaScriptで関数を定義する際の基本的な構文です。

  2. JavaScriptにおける関数とメソッドの違いとは?わかりやすく解説

    JavaScriptにおいて、関数とメソッドは本質的には同じものです。両者の違いは、メソッドがオブジェクトのプロパティとして定義された関数であるという点にあります。つまり、独立して定義されたものを「関数」、オブジェクトに紐づけられたものを「メソッド」と呼びます。 JavaScriptの関数の基本形 まず、一般的な関数の定義方法を見てみましょう。 function functionname(param1, param2){ // 処理内容 } JavaScriptのメソッドの例 メソッドは、オブジェクトに関連付けられた関数です。次の例では、employeeオブジェクトの中にdetails