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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

2083閲覧

オブジェクト指向 インスタンスをクラス型へ格納? メリットは何ですか?

tomotomtony

総合スコア14

C#

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2017/01/07 07:06

あるクラスのインスタンスを継承しているクラス型に格納するという話を何度か目にしました。
学部時代に研究室の先輩に説明してもらったのですが、なぜこのようなことをすると便利なのか忘れてしまいました。
どなたかご回答、よろしくお願いします。

ーーーーーーーーーコードーーーーーーーーーーーーーーーーーーー
1: namespace ConsoleApplication5
2: {
3: using System;
4:
5: public class Person
6: {
7: public virtual string getName()
8: {
9: return "私には名前がありません。";
10: }
11: }
12:
13: public class Taro : Person
14: {
15: public override string getName()
16: {
17: return "私の名前は太郎です。";
18: }
19: }
20:
21: public class Class1
22: {
23: public static int Main(string[] args)
24: {
25: Person person = new Person();
26: Console.WriteLine( person.getName() );
27: Taro taro = new Taro();
28: Console.WriteLine( taro.getName() );
29: Person someone = new Taro();⇦ここです!!
30: Console.WriteLine( someone.getName() );
31: return 0;
32: }
33: }
34: }
ーーーーーーーーーーーーーーーーーーー
私としてはPerson someone = new Taro();ではなく
Person someone = new Person();
にするのと変わらないのでは?と思います。

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

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

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

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

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

ozwk

2017/01/07 07:15

質問とコードが食い違っている気がします : Person someone = new Person(); -> Taro someone = new Taro();では?
tomotomtony

2017/01/07 08:17

いえ、このままであっているかと。インスタンスとクラスの型が異なるところに意味があったような気がします。
miyabi-sun

2017/01/07 09:30

コードを囲うのはバッククォート3つ「```」の行で囲んでください。そうすると専用のフィールドで囲われてとても見やすくなります。
tomotomtony

2017/01/07 09:56

ご指摘ありがとうございます。
guest

回答3

0

ベストアンサー

私としてはPerson someone = new Taro();ではなく

Person someone = new Person();
にするのと変わらないのでは?と思います。

いえ、次の行の「Console.WriteLine( someone.getName() ); 」の結果はPerson のインスタンスか Taro のインスタンスかで異なりますよね。

なぜこのようなことをすると便利なのか忘れてしまいました。

オブジェクト指向のポルモアフィズム(=多様性)の特性を得るためです。この例ですと、 someone という変数には、Person のサブクラスに何が入っているかをしらずに someone.getName() を呼び出すことができるところにメリットがあるわけです。
名前を返すだけなら、 person クラスに文字列変数で名前をいれておけば良いので例としてはあまり良くありません。

多様性でよく使われる例は、クラス「図形」のサブクラスに「三角形」、「四角形」、「円」があって、図形には「中心点を取る」、「面積を計算する」などのメソッドがあるというものです。面積の合計を計算するプログラムが図形を巡回して面積を得るときに相手の図形の形を気にせずに「面積を計算する」を呼ぶことでできるというのが多様性のメリットです。
このとき、クラス「図形」の変数に new 三角形(), new 四角形() などのサブクラスのインスタンスを入れることになります。

投稿2017/01/07 07:28

mit0223

総合スコア3401

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

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

tomotomtony

2017/01/07 08:32

『Person のサブクラスに何が入っているかをしらずに someone.getName() を呼び出すことができるところにメリットがあるわけです。』 ↑については理解しました。ありがとうございます! ただ、図形 ○ = new 三角形() とすると、 三角形のメソッドやプロパティは使えず、 図形のメソッドやプロパティだけ使えるようになると思うのですが どうでしょうか?
mit0223

2017/01/07 08:46

> 三角形のメソッドやプロパティは使えず、 図形のメソッドやプロパティだけ使えるようになると思うのですが どうでしょうか? そのとおりです。かつ、各図形のサブクラスはもらさず、「面積を計算する」、「中心点を取る」といったクラス「図形」のメソッドを実装していなければなりません。この「図形」のようなクラスは抽象クラスと呼ばれていて、図形というクラスの外形だけを規定していることになります。 そのオブジェクトを「図形」として参照する人はそもそも中身に興味がないという前提なので、それでOKということです。
tomotomtony

2017/01/07 09:50

「そのオブジェクトを「図形」として参照する人はそもそも中身に興味がない」 ↑よくわかりました!ありがとうございます。
guest

0

「多態性」とか「ポリモーフィズム」をキーワードにググってみてください。ここの限られたスペースの回答欄で得られる情報以上の情報が得られると思います。

投稿2017/01/07 07:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こんにちは。

Person someone = new Taro();の場合とPerson someone = new Person();の場合の両方について走らせてみると結果の違いが分かりますよ。
といいますか、その違いが分かるようなサンプルになってますね。
ですので、このまま走らせてみましょう。

投稿2017/01/07 07:47

Chironian

総合スコア23272

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

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

tomotomtony

2017/01/07 08:26

両方とも、getName()は「私には名前がありません。」と返してきました。 インスタンスの型がTaroだろうとPersonだろうと、クラス型がPersonであるなら、 メソッドもプロパティもPersonのものしか使えないので、 なぜこれが便利なのかわかりません。
Chironian

2017/01/07 08:55 編集

あれ、もしそうなら、便利じゃないですね。 Person someone = new Taro();では「私の名前は太郎です。」が表示される筈なのですが。 そのまんまやってみました。 ----------------- 私には名前がありません。 私の名前は太郎です。 私の名前は太郎です。 ----------------- と表示されましたよ。最後の行はPerson someone = new Taro();ですから、tomotomtonyさんのトライは何か間違ったのではないかと思います。
tomotomtony

2017/01/07 09:52

vertural と override を加えるのを忘れてました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問