C#におけるメソッドのオーバーライドとメソッドの非表示の違いを徹底解説
C#には、子クラスが親クラスのメソッドを再定義し、新しい実装を提供するための仕組みとして、「メソッドのオーバーライド」と「メソッドの非表示」という2つの方法があります。どちらも継承と密接に関わる重要な概念ですが、再実装のやり方や実際の動作には大きな違いがあります。この記事では、両者の違いを比較表とサンプルコードを使って詳しく解説します。
メソッドのオーバーライドとメソッドの非表示の主な違い
| 番号 | 比較項目 | メソッドのオーバーライド | メソッドの非表示 |
|---|---|---|---|
| 1 | 定義 | 親クラスと子クラスが同じ名前・パラメータ・シグネチャを持つメソッドを定義し、子クラスのオブジェクト経由で呼び出したときに子クラス側の実装が実行される、ポリモーフィズムを実現するための仕組みです。 | newキーワードを使って親クラス(基底クラス)のメソッドを再定義し、親クラスが提供していた元の実装を隠すテクニックです。 |
| 2 | 親クラスの実装へのアクセス | 子クラスからbaseキーワードを使うことで、親クラスのメソッド実装にアクセスできます。 | 子クラスの参照からは、親クラスの元のメソッド実装にアクセスできません。 |
| 3 | 使用するキーワード | overrideキーワードを使用します。 | newキーワードを使用します。 |
| 4 | 実装タイプ(バインディング) | メソッドの呼び出しはオブジェクトの実際の型に基づいて解決されます(実行時ポリモーフィズム)。 | メソッドの呼び出しは参照変数の型に基づいて解決されます(コンパイル時バインディング)。 |
| 5 | 親クラス参照が子クラスのオブジェクトを指す場合 | 親クラス型の参照変数が子クラスのオブジェクトを指している場合、子クラスでオーバーライドされたメソッドが呼び出されます。 | 親クラス型の参照変数が子クラスのオブジェクトを指している場合、親クラス側の(隠された)メソッドが呼び出されます。 |
| 6 | 用途 | 既存メソッドの実装内容だけを再定義します。 | メソッド自体を完全に再定義することができます。 |
動作の違いがわかるサンプルコード
次のコードは、オーバーライドと非表示の挙動の違いを示したものです。
using System;
class Animal
{
public virtual void Speak()
{
Console.WriteLine("動物が鳴きます");
}
}
class Dog : Animal
{
// オーバーライド:親クラスの実装を差し替える
public override void Speak()
{
Console.WriteLine("ワン!ワン!");
}
}
class Cat : Animal
{
// 非表示:親クラスの実装を隠して新しいメソッドを定義する
public new void Speak()
{
Console.WriteLine("ニャー");
}
}
class Program
{
static void Main()
{
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.Speak(); // 出力:ワン!ワン!(子クラスの実装が呼ばれる)
animal2.Speak(); // 出力:動物が鳴きます(親クラスの実装が呼ばれる)
}
}
このように、overrideを使った場合は親クラス型の参照からでも子クラスの実装が呼び出される一方、newによる非表示では参照変数の型(親クラス型)に応じたメソッドが呼び出されます。
使い分けのポイント
- オーバーライド:親クラスのメソッドの振る舞いを差し替えたい場合や、ポリモーフィズムを活用したい場合に適しています。
- 非表示:親クラスの実装とは独立した、まったく別の処理を同名のメソッドとして定義したい場合に使います。ただし、意図しない挙動につながりやすいため、設計上の必要性が明確な場合に限定するのが望ましいでしょう。
まとめると、メソッドのオーバーライドは「実装の差し替え」によって多態性を実現する機能であり、メソッドの非表示は「親の実装を隠して新たな定義を行う」機能です。それぞれの特性を理解し、目的に応じて正しく使い分けることが、保守性の高いC#プログラムを作成するうえで非常に重要です。
-
Java 8のデフォルトメソッドと静的インターフェースメソッドの違いを徹底解説
Java 8では、インターフェースに「デフォルトメソッド(default)」と「静的メソッド(static)」という2つの新しいメソッド形式が導入されました。一見似ていますが、役割や使い方が大きく異なります。本記事では、Oracleの公式ドキュメントに基づき、両者の違いを比較表とサンプルコード付きでわかりやすく解説します。 デフォルトメソッドとは OracleのJavadocによると、デフォルトメソッドは「ライブラリのインターフェースに新しい機能を追加しつつ、旧バージョンのインターフェース向けに書かれたコードとのバイナリ互換性を確保できるようにする仕組み」です。defaultキーワードを付け
-
【初心者向け】Pythonの関数とメソッドの違いを徹底解説!基本構文と実例つき
関数(Function)とは 関数とは、特定のタスクを実行するためにまとめられたコードブロックです。独自のスコープを持ち、名前を指定して呼び出します。引数は0個でも複数個でもよく、処理の終了時に値を返すことも、返さないことも可能です。 関数の基本構文 def 関数名(引数1, 引数2, ...): # 関数本体 それでは、ごくシンプルな「sum」という関数を作成してみましょう(関数名は自由に付けてかまいません)。この関数は num1 と num2 という2つの引数を受け取り、その合計を返します。sum(5, 6) のように呼び出すと、11 が返されます。 def sum(num1