No.3ベストアンサー
- 回答日時:
異種リストを多態性を用いて実現するのは、一つの例ですね。
#2の方の方針も基本的には同じ応用例だと思います。じつは、多態性には、もっと重要な応用例があります。そして、これは現在のWindowsMFCプログラミングで多用されています。
Windowsはイベントドリブン型の実行方式であることは、ご存知でしょうか?ここに大きなポイントがあるのです。
いまクラス(CView)があるとしましょう。
class CView{
public:
virtual void OnDraw(CDC* pDC);
};
いま、このCViewクラスには仮想関数OnDrawがあったとします。これは、描画が必要になったときに、Windowsプロシージャから呼び出される関数です。
さらにここで、CViewからクラスCMyViewを派生させましょう。
class CMyView : public CView{
public:
virtual void OnDraw(CDC* pDC);
};
ここで、OnDrawの実体部に具体的な描画操作を書いておくとします。
さて、いままでの話は準備でした。
ここからが本題です。
いま、アプリケーションのビューを登録するのに、
void Add(CView* pView);
となる関数が与えられているとしましょう。
この関数によってCViewが登録されると、描画が必要な際に、
pView->OnDraw(pDC);
を自動で呼び出すようになっています。
もしここで、
Add(new CMyView());
と登録すれば、描画が必要な際には自動的に、
CMyView::OnDraw(CDC* pDC)を呼び出してくれるわけです。
これは通常の関数によるオーバーライドでは実現できません。オーバーライドしていたのでは、CView::OnDraw(CDC* pDC);が呼び出されてしまいます。
もしかしたら、Add(CView* pView)について疑問が残るかもしれません。
Add(CMyView* pMyView);という関数を作って、pMyView->OnDrawを呼び出せば、確かに同じ動作をしてくれるでしょう。
しかし、Add(CView* pView);はライブラリで規定されている関数なのです。つまり、C言語でのprintfのようなもの。Add(CMyView* pMyView);という関数をつくるということは、ライブラリを有効利用しないということなのです。
そのような観点から言えば、先ほどの異種リストも同じことが言えます。抽象度が高い「動作」の部分をライブラリにしておきさえすれば、具体的なものを考えたときに、すばやく目的の動作を実現できる。
この概念はWindowsプログラミングのようにプログラム規模がとても大きくなる場合は、どうしても利用しなくてはならないでしょう。
確かに多態性はわかりにくい概念ではあります。
しかし、抽象度の高いプログラムがあらかじめ作成されていて、それを具体的な目的で利用するといった場合、有効な方法なのです。
この回答への補足
回答、ありがとうございます!
説明していただいて、
さらに納得の度合いが増しました^^
これから、実際にどんどん実装してみて理解度を増してゆきたいと思います。
ひとつ確認させていただきたいのですが、
>もしここで、
> Add(new CMyView());
>と登録すれば、描画が必要な際には自動的に、
>CMyView::OnDraw(CDC* pDC)を呼び出してくれるわけです。
> これは通常の関数によるオーバーライドでは実現できません。
>オーバーライドしていたのでは、CView::OnDraw(CDC* pDC);が呼び出されてしまいます。
は、書籍の中に説明にあったのですが、
通常の関数のオーバーライドでは上位型への回帰となる
(つまり、仮想関数のオーバーライドでないと、上位型メソッドのふるまいとなる)、
という理由からでしょうか?
No.4
- 回答日時:
サブルーチンと対比すると分かりやすいと思います。
サブルーチンを利用すると呼び出されるプログラムを共通化できますが、多態性を利用すると呼び出し元のプログラムを共通化できます。
strategy パターンなどは、典型的な例だと思います。
http://www.atmarkit.co.jp/fdotnet/designptn/desi …
上記の様な説明は「オブジェクト指向でなぜつくるのか」という本に載っていました。
http://bpstore.nikkeibp.co.jp/item/main/14822281 …
この回答への補足
回答ありがとうございます!
>サブルーチンを利用すると呼び出されるプログラムを共通化できますが、
>多態性を利用すると呼び出し元のプログラムを共通化できます。
の部分を見て、
そういえば…!と、ふとどこかでその図を目にしたのを思い出しました。
今になって納得できた感じです。
#2さんのおっしゃっていたことをさらに理解できました。
>strategy パターンなどは、典型的な例だと思います。
>http://www.atmarkit.co.jp/fdotnet/designptn/desi …
ざっと見ていました。
まだ、よく分らないようです^^;
実際にコードを打ち込んでみたほうがいいみたいですね。
試してみたいと思います。
No.2
- 回答日時:
多態性は非常によく使います。
そうとは意識しないで使っている場合も結構あると思います。
例えば、「処理の大部分は共通なのに一部分だけ違う」場合、
実現するのには次の3つが考えられます。
A.全て違うメソッドにする。
B.メソッドの中で、タイプ別に分岐処理する。
C.処理の内容が違う部分をオブジェクトにして多態性を使う。
Cの方法を使うとコードを共通化でき、さらにすっきりとさせることができます。
具体的には、ソートなんていうのがあります。
ソートというのは、
1.レコードを取り出す
2.レコードを比較する。
3.その結果によってレコードを入れ替える。
というのが概略です。
このうち、2だけは様々な方法が存在します。
(レコードのどこを比較するか、大小をどう比較するか等)
そこで、比較のロジックだけをオブジェクトにしてソートルーチンに渡します。
ソート(レコード群 records, 比較オブジェクト comp){
recordsからレコード1を取り出す
recordsからレコード2を取り出す
int r = comp.compare(レコード1,レコード2)
rが正の数なら入れ替え
}
昇順でソートしたければ、そのような結果を返すように「比較オブジェクト」のcompareメソッドを
上書きしたクラスを定義しておくわけです。
このように、多態性はいろんなところで使われています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java オブジェクト指向プログラミングの実践本を紹介してください 3 2022/09/19 04:56
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Illustrator(イラストレーター) イラストレーターの面積を求める 1 2022/04/17 11:05
- Visual Basic(VBA) Excel VBA オブジェクトマクロ 使用指定について お詳しい方教えてください。 共通エクセルフ 2 2023/03/14 17:26
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) プログラミングって本来数学的な計算をする為のものではないのですか? 学校で配られたFortran90 11 2022/08/25 22:14
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#のクラスで値渡しをする
-
エクセルVBA 画像を貼り付ける...
-
VB.NETでのnothing の意義について
-
VBAでの[]
-
サーブレットコンテキストの意...
-
System.Collections.SortedList
-
Excel VBA 定数にオブジェクト...
-
String型からlong型への変換は...
-
オブジェクト指向プログラミン...
-
Vba ListViewの行挿入に関して...
-
ピクチャーボックスに点を打つ...
-
抽象クラスのオブジェクトを生...
-
VB.netでメソッドからコントロ...
-
[ASP.NET]DropDownListのDB連携...
-
servletからjspへオブジェクト...
-
UTF-8のテキストファイルを開く...
-
「タイプ初期化子が例外をスロ...
-
C# インスタンスの破棄
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VBAでの[]
-
Excel VBA 定数にオブジェクト...
-
C#のクラスで値渡しをする
-
サーブレットコンテキストの意...
-
VB.netでメソッドからコントロ...
-
Vba ListViewの行挿入に関して...
-
ピクチャーボックスに点を打つ...
-
VB.NETでのnothing の意義について
-
System.Collections.SortedList
-
servletからjspへオブジェクト...
-
VB2005でADDとINSERTの違いは?
-
javaで、、、
-
C#で親にイベントを投げる方法
-
VBスクリプトでテキストファイ...
-
エクセルVBA/SpecialCellsで特...
-
String型からlong型への変換は...
-
getHeigth,getWidthについて
-
MessageBox.Show(Me,…の「Me」...
-
UTF-8のテキストファイルを開く...
おすすめ情報