C#のオーバーライド(override)の基本と使い方を解説
生徒
「C#で親クラスの動きを変更したいときってどうするんですか?」
先生
「C#ではoverride(オーバーライド)という機能を使って、親クラスのメソッドの動きを子クラスで書きかえることができますよ。」
生徒
「へぇ〜、それってどういうときに使うんですか?」
先生
「では、オーバーライドの基本的な使い方を分かりやすく説明していきましょう!」
1. override(オーバーライド)とは?
オーバーライド(override)とは、C#で親クラスの機能(メソッドなど)を子クラスで書きかえる(上書きする)ための仕組みです。
たとえば、動物(Animal)という親クラスが「鳴く(MakeSound)」という動きを持っていて、それを犬(Dog)という子クラスでは「ワンワン」と鳴かせたいとき、overrideを使います。
このように、親クラスの共通の機能を、子クラスごとに違う動きにしたいときに使います。
2. オーバーライドの基本的な書き方
まずはオーバーライドの構文を確認しましょう。virtualとoverrideというキーワードを使います。
virtual:親クラスで「このメソッドは子クラスでオーバーライドできますよ」と宣言するキーワードoverride:子クラスで親のメソッドを上書きするときに使うキーワード
以下が基本的な例です。
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("何かの動物が鳴いています。");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("ワンワン!");
}
}
3. 実行結果を確認しよう
次に、上記のコードを使って、実際にオーバーライドがどのように動くのか確認してみましょう。
Animal myAnimal = new Animal();
myAnimal.MakeSound(); // 親クラスのメソッド
Dog myDog = new Dog();
myDog.MakeSound(); // 子クラスでオーバーライドされたメソッド
このコードを実行すると、以下のような出力になります。
何かの動物が鳴いています。
ワンワン!
親クラスのインスタンスでは元のMakeSound()が実行され、子クラスのインスタンスではoverrideされた内容が実行されているのがわかります。
4. オーバーライドを使うメリットとは?
overrideを使うことで、共通のルール(親クラス)を持ちながら、子クラスごとに違う動作をさせることができます。
たとえば、ゲームを作る場合に「キャラクター」という親クラスがいて、「攻撃する」動作を、それぞれ「戦士」「魔法使い」「弓使い」などで違う方法にしたいときに便利です。
このように、オブジェクト指向の考え方を活かした設計ができるようになります。
5. baseキーワードを使って親の動作も残す
子クラスでオーバーライドするだけでなく、親クラスの動作も活かしたい場合はbaseキーワードを使います。
以下はその例です。
class Cat : Animal
{
public override void MakeSound()
{
base.MakeSound(); // 親の動作も実行
Console.WriteLine("ニャーニャー!");
}
}
このようにbase.MakeSound()と書くことで、親クラスのメソッドも呼び出してから、追加で子クラス独自の動作を加えることができます。
6. virtual/overrideが必要な理由
なぜ親クラスにvirtual、子クラスにoverrideが必要なのでしょうか?
それは、安全性を保つためです。C#では、親クラスがvirtualをつけない限り、子クラスが勝手に上書き(オーバーライド)できないようになっています。
これにより、プログラムの構造が意図しない形で壊れるのを防いでくれます。
7. overrideとnewの違いに注意
子クラスで親と同じ名前のメソッドを定義するとき、overrideの代わりにnewを使うこともできますが、意味が異なります。
overrideは「親の動作を上書き」、newは「別のメソッドとして扱う」です。
間違えてoverrideと書かないと、意図した動作にならないことがあります。
まとめ
C#のoverride(オーバーライド)機能を学ぶことは、オブジェクト指向プログラミングを理解するうえでとても重要な一歩です。特に、親クラスのメソッドを子クラスで書き換えたい場面や、共通の基準を持ちつつ、それぞれのクラスで異なる処理を実現したいときに欠かせない仕組みです。この記事では、virtualキーワードで親クラスにオーバーライドの許可を出し、子クラスではoverrideキーワードを使って自由に振る舞いを上書きできるという流れを押さえました。
また、baseキーワードを使うことで、親クラスの処理を引き継ぎながら拡張する書き方も紹介しました。これは現実のプログラム開発でもよく使われるテクニックです。オーバーライドを活用することで、メソッドの再利用性が高まり、保守性や拡張性にも優れたコードを書けるようになります。
最後に、overrideとnewの違いにも触れました。見た目は似ていますが、意味が大きく異なるため、意図した動作を実現するには正しいキーワードを使うことが重要です。
実践:複数クラスを継承したオーバーライド例
以下のサンプルでは、動物の種類によって鳴き方を変えるオーバーライドの使い方をより実践的に確認できます。
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("動物が鳴いています。");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("ワンワン!");
}
}
class Bird : Animal
{
public override void MakeSound()
{
Console.WriteLine("ピヨピヨ!");
}
}
class Program
{
static void Main()
{
Animal[] zoo = { new Dog(), new Bird(), new Animal() };
foreach (var animal in zoo)
{
animal.MakeSound();
}
}
}
ワンワン!
ピヨピヨ!
動物が鳴いています。
この例では、同じメソッド名でもオブジェクトの種類に応じて異なる結果が出力されていることが分かります。まさにオーバーライドの力を活かした多態性(ポリモーフィズム)の基本です。
生徒
「先生、今日のオーバーライドの話で、クラスごとに振る舞いを変える方法がよく分かりました!」
先生
「そうですね。特にvirtualとoverrideの関係や、baseで元の処理も残せることを理解できたのは大きな収穫ですよ。」
生徒
「複数の動物クラスを配列にして、それぞれ違う鳴き方ができるのはちょっと感動しました!」
先生
「それがポリモーフィズムの魅力です。今後はもっと実践的な継承やインターフェースの使い方にも挑戦していくと、C#の力をもっと引き出せますよ。」
生徒
「はい!今日の内容を活かして、より良いクラス設計ができるように頑張ります!」