Class Help - Accessing Parent Methods from Child

Discussion in 'Ruby' started by Michael Boutros, Dec 3, 2007.

  1. 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
    --
    Posted via http://www.ruby-forum.com/.
     
    Michael Boutros, Dec 3, 2007
    #1
    1. Advertising

  2. Michael Boutros

    Phrogz Guest

    On Dec 2, 6:04 pm, Michael Boutros <> 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.
     
    Phrogz, Dec 3, 2007
    #2
    1. Advertising

  3. Hi --

    On Mon, 3 Dec 2007, Michael Boutros 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.


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


    David

    --
    Upcoming training by David A. Black/Ruby Power and Light, LLC:
    * Intro to Rails, London, UK, December 3-6 (by Skills Matter)
    See http://www.rubypal.com for details and 2008 announcements!
     
    David A. Black, Dec 3, 2007
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Martin Herbert Dietze

    Call child class methods in parent class

    Martin Herbert Dietze, May 3, 2005, in forum: C++
    Replies:
    9
    Views:
    1,034
    Victor Bazarov
    May 4, 2005
  2. metal
    Replies:
    8
    Views:
    517
    Bruno Desthuilliers
    Oct 30, 2009
  3. Kenneth McDonald
    Replies:
    5
    Views:
    342
    Kenneth McDonald
    Sep 26, 2008
  4. Noel Dolan
    Replies:
    0
    Views:
    249
    Noel Dolan
    Jul 18, 2004
  5. Bitswapper
    Replies:
    5
    Views:
    162
    Prasad, Ramit
    Aug 27, 2013
Loading...

Share This Page