(wacky?) protected behavior

D

David Weldon

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!
 
T

Trans

David said:
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!

But youre calling store from the subclass.

T.
 
D

David Weldon

Trans said:
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++.
 
T

Trans

David said:
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.
 
J

Jacob Fugal

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 Fugal
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,173
Messages
2,570,938
Members
47,473
Latest member
pioneertraining

Latest Threads

Top