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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

3548閲覧

rubyにおけるポリモーフィズムでサブクラス名による条件分岐

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2016/03/04 04:13

Rubyにおいてsuperクラスの関数をサブクラスで呼び出すとき,その関数を呼び出したクラス名によって場合分けしたいと考えています。

ruby

1#a,bは同じBaseクラスを継承している 2 3a = A.new 4b = B.new 5 6array = [a,b] 7 8for i in (0...array.length) 9 array[i].method(); 10end 11 12 13#以下のような動作がしたい 14 15Class Base 16 17 def Base << self 18 19 def method() 20 if (クラスAなら) 21 p 'This class is A !' 22 else 23 p 'This class is not A !' 24 end 25 end 26 27 end 28 29end

以上のコードはどう書くのがいい書き方になるでしょうか。メソッドの引数にflagなどを代入するやり方はできれば避けたいtです。よろしくお願いします。

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

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

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

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

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

guest

回答4

0

Base#method 中で 条件分岐させるのは、好ましくないです。
なぜなら、将来, Base を継承した C というクラスを作ったときに、Base#method を変更することが必要になるからです。

次のようにすると、Base を継承した C、D, ... をつくった場合でも、Base#method の変更は不要になります。
foo.rb

ruby

1class Base 2 def methodX 3 puts 'This class is Base !' 4 end 5 def methodY 6 puts "***(Base) This class is #{self.class} !" 7 end 8end 9 10class A < Base 11 def methodX 12 puts 'This class is A !' 13 end 14end 15 16class B < Base 17 def methodX 18 puts 'This class is B !' 19 end 20end 21 22[A.new, B.new, Base.new].each do |x| 23 x.methodX 24end 25puts 26[A.new, B.new, Base.new].each do |x| 27 x.methodY 28end

実行結果

$ ruby foo.rb This class is A ! This class is B ! This class is Base ! ***(Base) This class is A ! ***(Base) This class is B ! ***(Base) This class is Base !

投稿2016/03/04 11:42

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2016/03/04 17:38 編集

ありがとうございます。ここまでともなると派生先のクラスにメソッド記述した方が解りやすいかもしれませんね。今回はダックタイピングというほどではなく共通処理の中でスーパークラスのインスタンス変数の一部だけに違う値を代入させるということをさせたかったので色々試しましたが,結局条件分岐でメソッドを作る方針にしました。サブクラスにsuper入れてやる方法でやってましたがcase分岐の方がコードが少なく1つのファイルに修正すべきコードがまとまるのでこちらを採用します。
guest

0

.class.name でクラス名を得ることができます。
次のコードを参照してください。
1.rb

ruby

1def util_method(obj) 2 class_name = obj.class.name 3 p "This class is B #{class_name}!" 4 class_name 5end 6 7class Base 8 def method 9 util_method(self) 10 end 11end 12 13class A < Base 14end 15class B < Base 16end 17 18p [A.new, B.new, Base.new].map{ |x| x.method } 19puts 20p ['abc', [], 1.2, A.new].map{ |x| util_method(x) }

実行結果:

$ ruby 1.rb "This class is B A!" "This class is B B!" "This class is B Base!" ["A", "B", "Base"] "This class is B String!" "This class is B Array!" "This class is B Float!" "This class is B A!" ["String", "Array", "Float", "A"]

投稿2016/03/05 08:26

katoy

総合スコア22324

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

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

0

こんな感じですかね。

Ruby

1class Base 2 def method 3 case self 4 when A 5 puts "This class is A!" 6 when B 7 puts "This class is B!" 8 else 9 puts "I don't know this class!" 10 end 11 end 12end 13 14class A < Base 15end 16 17class B < Base 18end 19 20a = A.new 21b = B.new 22 23array = [a,b] 24 25array.each do |x| 26 x.method 27end

あるいは、a.is_a?(A) とか a.instance_of?(A) を使います。

投稿2016/03/04 04:38

otn

総合スコア84505

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

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

退会済みユーザー

退会済みユーザー

2016/03/04 04:45

case文だとselfだけでも型判別してくれるんですね 勉強になりました!
guest

0

ベストアンサー

self.kind_of?(A)
でクラスを判断できます。

ruby

1#!/usr/bin/env ruby 2# -*- encoding:utf-8 -*- 3# 4 5class Base 6 def method() 7 if self.kind_of?(A) 8 p 'This class is A !' 9 else 10 p 'This class is not A !' 11 end 12 end 13end 14 15class A < Base 16end 17 18class B < Base 19end 20 21a = A.new 22b = B.new 23 24array = [a,b] 25 26for i in (0...array.length) 27 array[i].method(); 28end

投稿2016/03/04 04:25

編集2016/03/04 04:29
NCC1701

総合スコア1680

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

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

退会済みユーザー

退会済みユーザー

2016/03/04 04:32 編集

こんな簡単にできるんですね! ありがとうございます!
NCC1701

2016/03/04 04:33

つかえます。サンプルも掲載しましたので、コピペで検証してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問