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

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

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

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

Q&A

2回答

1819閲覧

オーバーライドに関しての質問

supaidamam

総合スコア11

C#

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

0グッド

0クリップ

投稿2017/02/07 08:12

基本クラス型の参照変数は、派生クラスのオブジェクトを参照することがメソッドのオーバーライドを行うときに重要である、と自分が購入したテキストに載っているのですが、何故重要なのかが知りたいです。
宜しくお願いします。

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

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

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

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

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

ozwk

2017/02/07 08:17

なんというテキストでしょうか
supaidamam

2017/02/07 08:21

失礼しました。自分が学校で教師から配布(これを使い授業を進める)されたものの方でした。間違えた情報を提示してしまい申し訳ありませんでした。
ozwk

2017/02/07 08:29

具体的なコード例が載ってたらそれも質問文に載せて下さい
supaidamam

2017/02/07 08:33

オーバーライドに関する説明の方にこの文章が書いてあり、何が言いたいのかよくわからなかったんです。この文章に関して他の説明も具体的なコードもなく訳が分からない状態なんです…
tamoto

2017/02/07 08:44

「基本クラス型……重要である」までの文は、一字一句違いなくそのまま記載されていたものですか?
supaidamam

2017/02/07 08:48

はい、そうです。そこについては間違いはありません。一字一句そのままです。
Zuishin

2017/02/07 08:53

基本クラス型の変数に派生クラス型のオブジェクトを入れても変数は基本型のオブジェクトでなく派生クラス型のオブジェクトを参照するという意味じゃありませんか? いずれにせよ前後の文がないと文脈がわからないと思いますので、可能な範囲で載せてみてください。
supaidamam

2017/02/07 09:07

「子クラスで同じメソッド名で、引数もすべて同じメソッドを作ることをオーバーライドと呼ぶ。」が前の文で、自分の最初の質問に繋がり、その後に「また、子クラスで勝手にメソッドをオーバーライドされると同じ名前を付けてしまう等の思わぬバグが出たりするので、C#では親子両方に同意の下オーバーライドするようになっている」と書いてありました。
guest

回答2

0

確かに意味不明ですね。

イメージしやすくするために、具体的な例を出させてください。
Animal という抽象基本クラスがあり、それは Cry() というメソッドを持つとします。
Animal から派生した Dog というクラスがあり、やはり Cry() というメソッドを持ちます。
しかし、Animal 型の Cry() は実行すると例外を発生しますが、Dog 型の Cry() はオーバーライドされており、「Bow」というメッセージを出力します。
ここで Animal 型の変数 a を用意し、Dog 型のインスタンスを入れます。
ここで a.Cry() を実行すると、例外を発生するのではなく、「Bow」というメッセージを出力します。
a は Animal 型ですが、実際に実行されるのは Dog 型のオーバーライドされたメソッドだからです。

推測ですが、この例で言うと、「基本クラス型の参照変数は、派生クラスのオブジェクトを参照することがメソッドのオーバーライドを行うときに重要である」は、「基本型(Animal 型)の参照変数は、(ここでは)派生クラス(である Dog )のオブジェクトを参照すること(を理解すること)がメソッドのオーバーライドを行う時重要である」くらいの意味ではないかと。

投稿2017/02/07 09:38

Zuishin

総合スコア28660

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

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

0

こんにちは。

単純な関数のオーバーライドの場合、基底クラス型の変数で派生クラス型のオブジェクトを参照する(1)ことに重要性は全くありません。
(1)の状態で、基底クラス型変数の当該メソッドを呼び出した場合、基底クラスのメソッドが呼ばれますので極当たり前の動作ですから。

しかし、仮想関数にすると高度な機能を実現できます。通常のオーバーライドに加えて、基底クラス側ではvirtualキーワードを付け、派生クラス側ではoverrideキーワードを付けることで仮想関数のオーバーライドとなります。
これにより(1)の状態で基底クラス型変数の当該メソッドを呼び出した場合、派生クラスのメソッドが呼ばれます。
この動作により、基底クラスとして呼び出したにも関わらず、派生クラスの動作をするので「統一的に扱いつつ、それぞれに応じた動作を行う」ことを実現できます。

補足から、恐らく仮想関数のことが書かれているのだと思いますが、用語も一文ごとに異なりますし、苦労をお察しします。

投稿2017/02/07 09:40

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問