• ベストアンサー

クラスの継承で既存の機能に処理を追加して拡張できる

クラスの継承で「既存の機能に処理を追加して拡張」できるらしいのですが、そのような例をみたことがないので、どなたかサンプルとして書いていただけないでしょうか。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ksdnmk
  • ベストアンサー率50% (1/2)
回答No.7

今までの回答と重複する部分がありますが、ご勘弁ください。 「たのしいRuby」を読んでないのですが、#1の補足に書かれている3つは、オブジェクト指向におけるクラスの継承の説明かと思われます。 - 機能 = メソッド - 処理 = なんらかのコード と解釈している前提で、それぞれのサンプルを書いてみます。 # インデントに全角スペースを使っているので、コピペの際には注意してください。 1 既存の機能はそのままで、まったく新しい機能を追加する 子クラスにメソッドを追加することですよね。 class MyString < String  # hogeという文字列を返すメソッドを追加  def hoge   'hoge'  end end 2 既存の機能を定義し直して同じ名前のメソッドに違う振る舞いをさせる メソッドのオーバーライドですよね。 class MyString < String  # replaceを書き換える  def replace other   puts 'replaceなんてしませんよ!'  end end 3 既存の機能に処理を追加して拡張する 既存のメソッドの機能を活かし(super)つつ、処理を追加します。 2と違うのはsuperを呼んでいることで、親クラスの処理を使っています。 class MyString < String  # replaceする文字列に必ずゴミをつける機能を追加します  def replace other   other << 'gomi'   super other  end end p String.new('foo').replace('bar') => 'bar' p MyString.new('foo').replace('bar') => 'bargomi' # 実用性が全くなくてすみません 誰が作ったクラスか、メソッドかは関係なく、「既存の機能」とは親クラスが持っているメソッドのことを指していると考えられます。 上記のサンプルの場合、親クラスはStringなので、Stringクラスが持つメソッド全てが「既存の機能」になります。 既存の機能(super)に処理を追加(other << 'gomi')することで、メソッドを拡張することができるということです。 継承した場合は親クラスと同じ挙動となります。 変更しない部分については、基本的にコードを書く必要はありません。 クラスの継承はオブジェクト指向の特徴的な部分なので、オブジェクト指向の説明に特化した本に目を通すと、より理解が深まるかと思います。

LLR4
質問者

お礼

ありがとうございました。これで何かすっきりした気分です。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.6

>自前の作ったメソッドでもそういうことができるのかなと思ったまでです。 できますよ。 「既存」とは、「それ以前に定義されて、その時点で存在している」と言う意味です。誰が定義したかは関係ありません。

LLR4
質問者

お礼

そういう揚げ足を取られると何とも言いようがありません。すいませんが、他の方にお答え願いたいと思います。よろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.5

>3の補足 >>考えていたのは、メソッドにどのように機能を追加するかでした。 >3の補足でいった「機能」とはメソッドのことを指しています。 とすると、「メソッドにメソッドを追加したい」ということですか?出来る出来ない以前に、意味がわかりません。 >既存メソッドの追加処理に関しては、もっと簡単な事例はないでしょうか? きわめて簡単な例を書いたのですが。 何をしたくて何がわからないのですか?「機能」と「処理」という言葉を使わないで書いてみてください。superがわからないとか? もしかすると、 「本を読んでいると、<既存の機能に処理を追加して拡張> と書いてあったが、私には意味がさっぱりわからない。どういう意味なんでしょう?」ということだったんでしょうか?

LLR4
質問者

お礼

機能=メソッドだとすると、「既存の機能に処理を追加して拡張」いうのは 「メソッドに新しい処理を追加して拡張する」いう意味にとれるので、そのやり方がわからなかった訳です。前にchompの例がたぶんそれにあたるのかもしれませんが、既存のメソッドではなく自前の作ったメソッドでもそういうことができるのかなと思ったまでです。これでご理解なされたでしょうか?

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.4

言葉をいい加減に使うと意志の疎通が出来ません。 元の質問、 >クラスの継承で「既存の機能に処理を追加して拡張」できるらしいのですが、 の「機能」と「処理」はそれぞれ何を意味していますか?私は機能=メソッド、処理=何らかのコード、と解釈しました。合ってますか? 3の補足 >考えていたのは、メソッドにどのように機能を追加するかでした。 この文の「機能」は、上の文の「機能」と同じ意味ですか? >これは元から無理なんですね。 既存メソッドに追加処理のためのコードを付加することは可能で、それは#1、#2の回答に書いた通り。

LLR4
質問者

お礼

わざわざ何度もありがとうございます。 この「機能」と「処理」は「たのしいRuby」の120ページに書いてあるもので、そこにはこれ以上の説明はありません。 3の補足でいった「機能」とはメソッドのことを指しています。 既存メソッドの追加処理に関しては、もっと簡単な事例はないでしょうか? よろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

>こういった場合は追加するところまでは、スーパークラスと同じことをそのまま書かないといけないということになりますが、それが正解なのでしょうか? すいません。おっしゃりたいことがわかりません。

LLR4
質問者

お礼

class MyString < String  def anti_capitalize   capitalize.swapcase  end  def empty?   self == "empty"  end # ここまで変更するところがない # ここから機能に処理の追加 # あまりいい例が思い浮かばない。実際にはよくあるパターンですが # chompで、末尾文字の削除がおこったかどうか、STDERRにメッセージを出す  def chomp(rs=$/)   x = self #処理前を保存しておく   y = super #親クラスのchomp呼び出し   if x == y     STDERR.puts "削除は無し"   else     STDERR.puts "削除発生!"   end   y  end end #テスト a=MyString.new("abc") puts a.anti_capitalize b=MyString.new("empty") puts a.empty? puts b.empty? c=MyString.new("abc\n") puts a.chomp puts b.chomp("y") puts c.chomp 上記の場合のことを言ったつもりなのですが、うまく表現できず申し訳ありません。

LLR4
質問者

補足

分りました!機能=メソッドと考えればいいんですね。考えていたのは、メソッドにどのように機能を追加するかでした。これは元から無理なんですね。すいませんでした。お騒がせして申し訳ありません。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

機能=メソッドだとして、 (↓全角空白で段付けしてあるので、コピペするなら注意) class MyString < String # String に無かった機能の追加 # 先頭文字を小文字に、2文字目以降を大文字に  def anti_capitalize   capitalize.swapcase  end # String にあった機能の意味変更 # empty?を空文字列でなく、"empty"という文字列の時に真になるようにする  def empty?   self == "empty"  end # 機能に処理の追加 # あまりいい例が思い浮かばない。実際にはよくあるパターンですが # chompで、末尾文字の削除がおこったかどうか、STDERRにメッセージを出す  def chomp(rs=$/)   x = self #処理前を保存しておく   y = super #親クラスのchomp呼び出し   if x == y     STDERR.puts "削除は無し"   else     STDERR.puts "削除発生!"   end   y  end end #テスト a=MyString.new("abc") puts a.anti_capitalize b=MyString.new("empty") puts a.empty? puts b.empty? c=MyString.new("abc\n") puts a.chomp puts b.chomp("y") puts c.chomp

LLR4
質問者

お礼

回答ありがとうございます。こういった場合は追加するところまでは、スーパークラスと同じことをそのまま書かないといけないということになりますが、それが正解なのでしょうか?

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

機能とはメソッドのことでしょうか? class MyClass < OriginalClass  def kinou # OgiginalClassにあるメソッド   独自に追加したい処理   super # OgiginalClassでの処理を呼び出す   独自に追加したい処理  end end

LLR4
質問者

お礼

ありがとうございました。簡単なことだったんですね。申し訳ありません。

LLR4
質問者

補足

と上記の回答でいいのかと思っていたのですが、「たのしいRuby」に載っていたのは、 1 既存の機能はそのままで、まったく新しい機能を追加する 2 既存の機能を定義し直して同じ名前のメソッドに違う振る舞いをさせる 3 既存の機能に処理を追加して格調する とあって、上記の回答は、1か2にあたってしまうのではないかと思います。それとも1と2の中間ということでしょうか?そういう解釈でよろしいのでしょうか。どなたかお答えよろしくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A