質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

3083閲覧

オーバーライドのメリットがわからない

Zashin_Dobashi

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/04/02 06:45

質問

プログラミングの基本的なことを訊きたいのですが、オーバーライドのメリットがイマイチわかりません。
オーバーライドはパターン1の様に使うと派生先のCatとDogのVoice関数を上書きできることは理解はしています。
ですが、パターン2でもいいのではないかと考えてしまいます。
なので、オーバーライドのメリットを教えてください。
メモリの節約になるとかですかね??

パターン1

C#

1class Animal 2{ 3 protected string name; 4 5 protected virtual void Voice() 6 { 7 8 } 9} 10 11class Cat : Animal 12{ 13 private override void Voice() 14 { 15 Debug.Log("にゃー"); 16 } 17} 18 19class Dog : Animal 20{ 21 private override void Voice() 22 { 23 Debug.Log("ワン"); 24 } 25}

パターン2

C#

1class Animal 2{ 3 protected string name; 4} 5 6class Cat : Animal 7{ 8 private void Voice() 9 { 10 Debug.Log("にゃー"); 11 } 12} 13 14class Dog : Animal 15{ 16 private void Voice() 17 { 18 Debug.Log("ワン"); 19 } 20}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/02 07:14 編集

「カプセル化」と「継承」と「多態性」の三点セットで考えた方が良さそうです。 > メモリの節約になるとかですかね?? それは完全に誤解ですね。誤解を解くためにも上に書いた三点セット(オブジェクト指向の三大要素)で考えることをお勧めします。
guest

回答4

0

ベストアンサー

まず、オブジェクト指向の基本概念を理解した方が早道です。

参考1: よい子のC++(オブジェクト指向完全理解)

参考1はC++出の説明ですが、C#でも発想自体は同じです。
単に メソッドをメンバ関数……とかと言い換えていたり、書き方が違うとかだけです。

つまり、『データ(= フィールド) と処理(= メソッド) をひとまとめにしたオブジェクト』なるものを中心に見る発想法です。

そして、継承や実装っていうのは、『実装する場合は必ず親(インターフェース等)が持つメンバを実装しなければならない』です。

言い換えると、『親が持っているメンバは子も持っている』と言う状態です。

そして、その挙動(メソッドによる処理)をそれぞれの子によって変動させるためにオーバーライドをします。

これによって、『オブジェクトだけが対象データと処理方法を知っている』と出来るのです。

このOOPの基本概念を表現するためにクラスやらメソッドやらオーバーライドやらがあるのです。

クラスがある -> オブジェクト指向だ!!

ではないです。


[追記0]

あと、今回の質問にあるコードはprotected -> privateになっていますが、
publicの打ち間違いだとします。

そうすると、

私がサンプルを組むなら、

C#

1// Mainメソッド内だとして 2Dog pochi = new Dog(); 3pochi.Voice(); // -> 『ワン』 4Cat tama = new Cat(); 5tama.Voice(); // -> 『にゃー』

ではなく、

C#

1// Mainメソッド内だとして 2Animal pochi = new Dog(); // ← 子でnewして親で保持 3pochi.Voice(); // -> 『ワン』 4Animal tama = new Cat(); // ← 子でnewして親で保持 5tama.Voice(); // -> 『にゃー』

のようにします。

そうすると、オーバーライドをする意味が出てきます。(ポリモーフィズムを表現するためのものだから)

もちろん、状況によりますが。

投稿2021/04/02 07:28

編集2021/04/02 07:45
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単に機能的な入れ替えを行う前提で設計するのであればinterfaceとその実装でカバーすべきと思います。

public interface IAnimal { void Voice(); } public class Cat : IAnimal { public void Voice() { Debug.Log("にゃー"); } } public class Dog: IAnimal { public void Voice() { Debug.Log("ワン!"); } }

一方、overrideは慣習的に protected virtual なメソッドに対して行います。基底クラス + 仮想関数(override可能なvirtualメソッド)の組み合わせはフレームワーク的に既に呼び出し方が決まっているメソッドを、個別に実装する・しないを派生クラス側に選択可能とさせる目的で利用します。

あくまでoverrideで実装させる場合には、基底クラス側でのフレームワークとして必須な処理に加えて、フレームワーク的に提供している呼び出しタイミングにフックしたメソッド呼び出しを派生クラスから扱えるようにする目的がセットになると思います。

別の言葉でいうと、多少なりともレイヤーを分離して作ろうという意図があるところで、必須機能実装を基底クラスに、オプショナルな機能実装機会を派生クラスに持たせるような仕組みの中で override は効果的に機能するのかなと思います。

投稿2021/04/02 09:31

tor4kichi

総合スコア763

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オーバーライドする意味はこんな感じかなぁ

C#

1class Animal 2{ 3 protected string sVoice = ""; 4 5 protected virtual void Voice() 6 { 7 textToSpeach(sVoice); 8 } 9} 10 11class Cat : Animal 12{ 13 public override void Voice() 14 { 15 sVoice = "にゃー"; 16 base.Voice(); 17 } 18} 19 20class Dog : Animal 21{ 22 public override void Voice() 23 { 24 sVoice = "わん"; 25 base.Voice(); 26 } 27}

投稿2021/04/02 09:17

編集2021/04/02 09:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/02 09:57 編集

日本語で補足説明をするとbaseクラスには共通の機能を持たせて、派生クラスには派生クラスの特徴を持たせる感じ。
guest

0

C#

1 Cat cat = new Cat(); 2 Animal animal = cat as Animal; 3 animal.Voice();

上記のコードを実行する場合、パターン1では正常に動作しますが、パターン2では(Animalのほうに定義が無いため)エラーになります。
詳しくは「ポリモーフィズム」で調べてください。

投稿2021/04/02 06:49

編集2021/04/02 06:52
fiveHundred

総合スコア9908

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/04/02 06:56

そもそも質問のコードがおかしいので両方失敗する気が。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問