18

クラスがそのスーパークラスのインスタンス変数にアクセスする方法と、それが継承ではない方法を誰かが説明できますか?私は「Rubyプログラミング言語」と例について話している

class Point
  def initialize(x,y) # Initialize method 
     @x,@y = x, y      # Sets initial values for instance variables
  end

end

class Point3D < Point
 def initialize(x,y,z)
   super(x,y)
   @z = z
 end
 def to_s
   "(#@x, #@y, #@z)"  # Variables @x and @y inherited?
 end
end

Point3D.new(1,2,3).to_s => "(1, 2, 3)"

継承されていない場合、クラスPoint3Dアクセスxy内部はどのようにできますか?to_s本は言う:

「それらが継承されているように見えることがある理由は、インスタンス変数が最初に値を割り当てるメソッドによって作成され、それらのメソッドが継承または連鎖されることが多いためです。」

しかし、それが実際に何を意味するのか理解できません。

4

4 に答える 4

15

あなたは正しい、本は間違っている、または少なくとも言葉遣いが悪い


私は、この本は単に間違っているか、せいぜいかなり曖昧な説明をしていると主張します.

すべての OO 言語では、スーパークラスと派生クラスに個別のオブジェクトはありません。派生クラスのインスタンスを作成すると、それはスーパークラスのインスタンスであります。1 つのオブジェクトがあり、同時に両方のクラスです。

オブジェクトは 1 つしかないため、インスタンス変数のセットは 1 つだけです。

これは、他のすべての OO システムと同じです。どのメソッドが実行されるかが重要であり、メソッド自体が実際に継承されるものである方法について本が行う奇妙な議論は、明確さの点であまり追加されません。

用語の問題は、確かに、動的に型付けされたシステムではそもそも宣言がないため、サブクラスの定義はフィールド宣言を継承しないことです...もちろんフィールド宣言がないためです. しかし、継承するタイプがないからといって、反対のステートメント (「インスタンス変数は継承されない」) が真になるわけではなく、親が異なるインスタンス変数を持つことを意味するため、かなりの混乱が生じます。これは、オブジェクトについてそのように語ろうとする無意味な結果です。

于 2012-11-16T22:14:08.587 に答える
7

super(x,y)初期化メソッドである基本クラスのコンストラクターを呼び出します。取り出すsuper(x,y)と、変数@x@yは派生クラスに表示されません。

于 2012-11-16T21:42:51.743 に答える
1

紛らわしい表現です。@x、@y、および @z はすべて、その Point3D インスタンスのインスタンス変数です。その super(x,y) が存在しない場合、Point3D インスタンスには @x または @y がありません。

于 2012-11-16T21:43:31.703 に答える