スパークラスのスーパークラスのメソッドを呼び出したいです。
たとえば、Hoge3のスーパークラスがHoge2で、さらにそのスーパークラス
がHogeの時、Hoge3からHogeのメソッドを呼び出したいのです。
もう少し具体的に説明させてもらいます。
class Hoge
def initialize()
@name='hoge'
end
end
class Hoge2 < Hoge
def initialize()
super
@name='hogehoge'
end
end
class Hoge3 < Hoge2
def initialize()
super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。
puts @name
end
Hoge3.new()
上記実行結果は、hogehogeが出力ですが、
スーパークラスのスーパークラスが設定した@name値、
'hoge'が出力されるようにしたいです。
『Hoge3クラスはHoge2クラスを継承すればよいではないか?』
とも思うでしょうが、Hoge2クラスには、Hogeには無い機能が多く拡張されてると考えてください。
ご指導のほど、宜しくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
#2です。
無理矢理やるとすると、
class Hoge
def initialize()
@name='hoge'
end
end
class Hoge2 < Hoge
def initialize()
super
unless self.class == Hoge3
@name='hogehoge'
end
end
end
class Hoge3 < Hoge2
def initialize()
super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。
puts @name
end
Hoge3.new()
この回答への補足
notnotさん、たびたびのご回答ありがとうございます。
#2での補足に記したとおりでして、
Hoge2にはできれば、手を入れたくないのです。
説明不足ですみません。
Hoge2は#2での補足で言うところの、
class ZipOutputStream
に該当すので、
Hoge3でsuperした時にHoge2でsuperしたのと同じことをしたいのです。
No.2
- 回答日時:
クラスの設計が間違っていると思いますが、どうすればいいのかはこれだけではなんとも。
>『Hoge3クラスはHoge2クラスを継承すればよいではないか?』
は、『Hoge3クラスはHogeクラスを継承すればよいではないか?』の間違いですよね。
Hoge2でいろいろメソッドが定義されているということなら、moduleにしてincludeすればいいのでは?
この回答への補足
notnotさん、ご回答ありがとうございます。
たびたびのご回答で、感謝しております。
>は、『Hoge3クラスはHogeクラスを継承すればよいではないか?』の間違いですよね。
すみません。誤記です。
実はこの質問、notnotさんに先日ご回答頂いた質問
http://oshiete1.goo.ne.jp/qa5307792.html
から派生しております。
すごく具体的にやりたい事を書きに記します。
module Zip
class ZipOutputStream
include IOExtras::AbstractOutputStream
・・ snip ・・
def initialize(fileName)
super()
@fileName = fileName
@outputStream = File.new(@fileName, "wb")
・・ snip ・・
元のソースが上記になってまして、これを以下の様にクラス継承すると
した場合でして。。
require 'zip/zip'
module ZipKai
include Zip
class ZipOutputStreamKai < ZipOutputStream
def initialize()
super() #※←ここ。スーパークラスのZipOutputStreamでsuperするのと同じ意味合いにしたい
@outputStream = IO.new(1, "wb") #これでは上手くいかないのは別件
・・ snip ・・
アドバイスの程、宜しくお願いいたします。
No.1
- 回答日時:
hoge2がhogeを継承する際に、aliasで別名の定義をしておいて、Hoge3ではその別名を呼べば良いのではないでしょうか。
class Hoge
def initialize()
@name='hoge'
end
end
class Hoge2 < Hoge
alias :hoge_initialize :initialize
def initialize()
super
@name='hogehoge'
end
end
class Hoge3 < Hoge2
def initialize()
hoge_initialize
#super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。
puts @name
end
end
Hoge3.new()
この回答への補足
siffon9さん、ご回答ありがとうございます。
できれば、Hoge2には手を入れてくありません。
実はHoge2は、第三者提供のライブラリなもので。
説明不足ですみませんでした。
でも、アドバイスありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- CAD・DTP HO CADの活用について 1 2023/07/19 16:31
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- 経済 国債をどんどん発行して、国家予算に充てれば良いという考え方が提唱されてますが…… 5 2022/10/09 19:34
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- Excel(エクセル) エクセルについて教えてください。 1 2023/03/03 08:38
- PostgreSQL 【PostgreSQL】行の値の並びを変えるには 1 2023/03/21 16:46
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- 日本語 「使われている」と使い方が違うのは次のどれか 1 2022/07/11 20:08
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
パソコンのスクリーンセーバー...
-
VBScriptでExcel(2019)上のデー...
-
講義でわからないのですが以下...
-
C言語の入力した文字を反転させ...
-
パイソンエラーについて
-
pythonエラー
-
教えてください
-
(再質問)エクセルのマクロボ...
-
VBA
-
Ruby on railsをrails sで立ち...
-
じゃんけんのプログラムを作っ...
-
VBA メモ帳の上書き保存がしたい
-
英数字を含む文字列(0-9,A-Z)...
-
rubyの正規表現について
-
エクセルvbaでチェックボックス...
-
WinSCPで画像のように puttyを...
-
パイソンのクラスについて
-
プログラミング
-
WIN11にオフイスを複数入れるこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パイソンのクラス
-
No route matches [GET] "/post...
-
Rubyについて質問です
-
クラス名やモジュール名の競合...
-
HSTLやSSTL等のI/Oピン
-
What class are you in? には何...
-
テンプレートの特殊化でコンパ...
-
railsのlink_toに動的なclass指定
-
変数の隠蔽とは?
-
redirect先でredirect元の変数...
-
2つのクラスがお互いのポイン...
-
class roomとclassroom どちら...
-
特定のactionでのみvalidation
-
インスタンス内から自分のクラ...
-
Rails3 taskでDBのデータを参照...
-
構造体を使ったプログラム
-
下線部の答え教えてください こ...
-
【ruby】特異クラスを使って,Fi...
-
get() と find() の違いについて
-
「arg」は何の略?
おすすめ情報