(wacky?) protected behavior

class Foo
def store(o)
o.dave=1
end
end
class SubFoo < Foo
def initialize
@dave=2
end
def store
super(self)
end
protected
attr_accessor :dave
end
sf = SubFoo.new
sf.store
p sf

The above code executes and shows that sf.dave has been set to 1. I
assumed it would not work because I thought Foo should not have access
to protected members which were defined in its subclasses. Is this a
bug? If not, can someone explain why this works? Thanks!

David W. wrote:

  super(self)

to protected members which were defined in its subclasses. Is this a
bug? If not, can someone explain why this works? Thanks!

But youre calling store from the subclass.

T.

Trans wrote:

But youre calling store from the subclass.

I gather what you mean is that o.dave=1 is executed from the context of
a SubFoo and not from the context of a Foo. I guess thats how Ruby works
but it doesn’t seem intuitive to me because I’m not sure the equivalent
code would work in other languages I’m familiar with - namely Java and
C++.

David W. wrote:

Trans wrote:

But youre calling store from the subclass.

I gather what you mean is that o.dave=1 is executed from the context of
a SubFoo and not from the context of a Foo. I guess thats how Ruby works
but it doesn’t seem intuitive to me because I’m not sure the equivalent
code would work in other languages I’m familiar with - namely Java and
C++.

Thats right. I can say about th eother languages buit try this:

class Foo
def store(o)
p self # who am I?
o.dave=1
end
end
class SubFoo < Foo
def initialize
@dave=2
end
def store
super(self)
end
protected
attr_accessor :dave
end
sf = SubFoo.new
sf.store
p sf

T.

On 1/3/07, David W. [email protected] wrote:

Trans wrote:

But youre calling store from the subclass.

I gather what you mean is that o.dave=1 is executed from the context of
a SubFoo and not from the context of a Foo. I guess thats how Ruby works
but it doesn’t seem intuitive to me because I’m not sure the equivalent
code would work in other languages I’m familiar with - namely Java and
C++.

Ruby != Java && Ruby != C

Jacob F.