アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております。
rubyのコーディングで疑問が発生しましたので、質問させてください。

以下の様にクラスを定義してあるとします
クラスA 体裁を整えて標準出力するクラス
 ・インスタンス変数@Aを持つ
 ・@Aを元に整形して標準出力する振る舞いを持つ
クラスB Aの子クラスで、標準出力する内容を細かく設定するクラス
 ・独自のインスタンス変数は持たない
 ・親クラスのインスタンス変数@Aを編集する振る舞いを持つ

上記の実装である時、クラスBの振る舞いでクラスAのインスタンス変数@Aを編集しようとした際にエラーが発生します。
尚、レシーバはsuperです。
エラー内容
./clsb.rb:49:in `edt_dsp': super: no superclass method `edt_dsp' (NoMethodE
rror)

エラー文中に出てる'edt_dsp'というメソッドが親クラスのインスタンス変数を編集するメソッドです。
尚、子クラスには独自の変数は無いのでinitializeメソッドは定義していません。
なぜこのようなエラーが発生してしまうのかわからず困っています。
現在自分でも色々とサイトを回って調べていますが、解決には至っていません。
ご回答いただければ幸いです。
以上です。よろしくお願いします。

A 回答 (2件)

>尚、レシーバはsuperです。



これが引っかかりますね。super とは、親クラスの同名のメソッドを呼び出すキーワードなので、「レシーバはsuperです」は意味不明の文章です。

>./clsb.rb:49:in `edt_dsp': super: no superclass method `edt_dsp' (NoMethodE
rror)

というのは、「クラスBのメソッドedt_dspの中で、superと書かれていたので親クラスの同名メソッドを呼び出そうとしたが、親クラスAではメソッドedt_dspは定義されていない」というエラーですね。

実際、定義されて無さそうなので、superと書いたのが間違いでは?何をしたくてsuperと書いたのですか?

この回答への補足

お世話になっております。
JAVA等では子から親に定義されているメンバ変数aにアクセスする際は、
super.aと記述した様に記憶しています。
rubyでも同様の記法でコンパイルが通ったので、出来るのかなとやってみた次第ですが、同様の動作は期待出来ないのでしょうか。

補足日時:2009/11/05 08:39
    • good
    • 0

インスタンス変数 @a は、インスタンス(オブジェクト)に付随したもので、祖先・子孫クラスでも共通です。


クラス定義Aの中で現れるインスタンス@aと、子クラス定義Bの中で現れるインスタンス変数@aが別物と誤解されているようですが、違います。同じオブジェクトであれば同じものです。

従って、@a でアクセスします。

ちなみに、super.a とかくと、「親の同名メソッドを呼び出して、その結果のオブジェクトのメソッドaを呼び出す」という文法上正当な表現ではありますが、やりたいこととは全く違います。
    • good
    • 0
この回答へのお礼

お世話になっております。
notnotさん、回答ありがとうございます。
教えていただいた事を踏まえてソースを整理して、
解決に至る事ができました。
ありがとうございました。

それから、前回補足投稿させていただいた中に、
コンパイラ云々と書いていましたが、IDEです。
インタプリタのRubyを使っているのに、頓珍漢な事を言って混乱させてしまっていたら、すみません。

お礼日時:2009/11/06 17:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!