Phrogz
12/3/2007 3:31:00 AM
On Dec 2, 6:04 pm, Michael Boutros <m...@michaelboutros.com> wrote:
> Hello everyone, I'm working on an API for Google Reader, and I'm having
> some trouble with classes and inheritance and the like. I've got my main
> class, Reader, and then two children classes, Subscription < Reader and
> Item < Reader. Now, in my instance of Reader, I have two class variables
> set: @headers, which are the headers that are to always be included in
> the Net::HTTP call, and @connection, the Net::HTTP instance that is
> connected to the Google Reader API.
>
> I then have a method called get_page in Reader, which takes a URL and
> any custom headers, then does the call. All this works perfectly well,
> when #get_page is called from Reader. However, I also want to call
> get_page from Subscription and Item. However, understandably, when I
> call it from Subscription, I get an error that @connection and @headers
> are undefined. I don't know where to start or what to do.
class Reader
HEADERS = "<headers>"
@@connection1 = "con1"
@connection2 = "con2"
class << self
attr_reader :connection2
end
def do_things
p HEADERS
p @@connection1
p self.class.connection2
end
end
class Subscription < Reader
def do_things
p HEADERS
p @@connection1
p self.class.connection2
p self.class.superclass.connection2
p Reader.connection2
end
end
Reader.new.do_things
#=> "<headers>"
#=> "con1"
#=> "con2"
Subscription.new.do_things
#=> "<headers>"
#=> "con1"
#=> nil
#=> "con2"
#=> "con2"
Conclusion: If you want to access class-level information from a
superclass, the simplest way is to use a constant (if the value is
constant). If the value needs to change, you can use a
@@class_variable (which is shared between the superclass and all its
descendants) or you can explicitly find the class you're interested in.