Class Help - Accessing Parent Methods from Child

  • Thread starter Michael Boutros
  • Start date
M

Michael Boutros

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.

Any ideas?

Thanks,
Michael Boutros
 
P

Phrogz

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.
 
D

David A. Black

Hi --

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.

The variables you've mentioned (@headers and @connection) are instance
variables, not class variables. Class variables have two @@'s.


David
 

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
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top