abstract superclasses

Discussion in 'Ruby' started by Giles Bowkett, Oct 17, 2007.

  1. Giles Bowkett, Oct 17, 2007
    #1
    1. Advertising

  2. On 17.10.2007 21:22, Giles Bowkett wrote:
    > I sometimes use the Java thing of an abstract superclass in Ruby. I
    > usually just set up the abstract parent so that it'll break if used
    > directly. Is it better to just use Modules? Have other people run into
    > this?


    Why bother? If your "abstract" class requires a method to be present
    then just not defining it works pretty well - in modules as well as in
    classes:

    irb(main):001:0> o=Object.new.extend Enumerable
    => #<Object:0x1001a92c>
    irb(main):002:0> o.map {|y| y.to_i}
    NoMethodError: undefined method `each' for #<Object:0x1001a92c>
    from (irb):3:in `map'
    from (irb):3
    from :0
    irb(main):003:0>

    Of course you need some documentation about the missing method - that
    would probably be the only reason why I'd add a dysfunctional definition
    of that method...

    Kind regards

    robert
     
    Robert Klemme, Oct 17, 2007
    #2
    1. Advertising

  3. Giles Bowkett

    Thomas Adam Guest

    On 17/10/2007, Giles Bowkett <> wrote:
    > I sometimes use the Java thing of an abstract superclass in Ruby. I
    > usually just set up the abstract parent so that it'll break if used
    > directly. Is it better to just use Modules? Have other people run into
    > this?


    I'd use a Module, yes. Or a class:

    class SomeClassMimickingAbstract
    private_class_method :new
    end

    But you don't need to think this way in Ruby -- unlike Java, Ruby is
    weakly typed.

    -- Thomas Adam
     
    Thomas Adam, Oct 17, 2007
    #3
  4. ]On Oct 17, 2:41 pm, "Thomas Adam" <> wrote:
    > On 17/10/2007, Giles Bowkett <> wrote:
    >
    > > I sometimes use the Java thing of an abstract superclass in Ruby. I
    > > usually just set up the abstract parent so that it'll break if used
    > > directly. Is it better to just use Modules? Have other people run into
    > > this?

    >
    > I'd use a Module, yes. Or a class:
    >
    > class SomeClassMimickingAbstract
    > private_class_method :new
    > end
    >
    > But you don't need to think this way in Ruby -- unlike Java, Ruby is
    > weakly typed.
    >
    > -- Thomas Adam


    How do you suggest to use that class? I understanding keeping the
    "abstract" class from being instantiated, but what about the concrete
    classes, the ones you're going to use?

    class RealThing < SomeClassMimickingAbstract
    # now make .new public again
    end

    Ugly, isn't it? Of course, that's just more fuel for the "don't do
    this in Ruby" fire.

    --
    -yossef
     
    Yossef Mendelssohn, Oct 18, 2007
    #4
  5. Hi --

    On Thu, 18 Oct 2007, Yossef Mendelssohn wrote:

    > ]On Oct 17, 2:41 pm, "Thomas Adam" <> wrote:
    >> On 17/10/2007, Giles Bowkett <> wrote:
    >>
    >>> I sometimes use the Java thing of an abstract superclass in Ruby. I
    >>> usually just set up the abstract parent so that it'll break if used
    >>> directly. Is it better to just use Modules? Have other people run into
    >>> this?

    >>
    >> I'd use a Module, yes. Or a class:
    >>
    >> class SomeClassMimickingAbstract
    >> private_class_method :new
    >> end
    >>
    >> But you don't need to think this way in Ruby -- unlike Java, Ruby is
    >> weakly typed.
    >>
    >> -- Thomas Adam

    >
    > How do you suggest to use that class? I understanding keeping the
    > "abstract" class from being instantiated, but what about the concrete
    > classes, the ones you're going to use?
    >
    > class RealThing < SomeClassMimickingAbstract
    > # now make .new public again
    > end
    >
    > Ugly, isn't it? Of course, that's just more fuel for the "don't do
    > this in Ruby" fire.


    You could do:

    class C
    private_class_method :new
    def self.inherited(c)
    class << c; public :new; end
    end
    end

    I've actually never felt the need for abstract classes in Ruby
    programs. I'm not a Java programmer, so it never would have occurred
    to me in that context, and I haven't found myself inventing it for
    Ruby.


    David

    --
    Upcoming training from Ruby Power and Light, LLC:
    * Intro to Ruby on Rails, Edison, NJ, October 23-26
    * Advancing with Rails, Edison, NJ, November 6-9
    Both taught by David A. Black.
    See http://www.rubypal.com for more info!
     
    David A. Black, Oct 18, 2007
    #5
  6. On 10/17/07, David A. Black <> wrote:

    >
    > I've actually never felt the need for abstract classes in Ruby
    > programs. I'm not a Java programmer, so it never would have occurred
    > to me in that context, and I haven't found myself inventing it for
    > Ruby.


    Note that ActiveRecord has a slightly different spin on the notion of
    abstract class.

    ActiveRecord::Base has a rw attribute called abstract_class and an
    abstract_class? predicate method.

    ActiveRecord::Base subclasses can be 'set' as abstract the meaning is
    that such classes don't have a corresponding database table. They are
    used as intermediate superclasses, typically to let a set of AR
    classes to inherit a common database connection different from other
    AR classes in the same application.


    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
     
    Rick DeNatale, Oct 18, 2007
    #6
  7. It is a Java thing; it comes from "Refactoring," I think, the Martin
    Fowler book. The idea is you handle excessive if/else/etc. statements
    by creating classes and putting the different code branches in
    subclasses. Since you'll have pieces which don't need to be different
    in the subclasses, you keep those pieces in the superclass so you have
    them in one place.

    In practice I usually do the unimplemented method thing, so that
    misusing the code just makes things blow up. The method hiding and
    revealing is probably overkill, although if you extract it into a
    module, you can have an AbstractSuperclass module pretty easily, which
    is a gajillion times better than comments which say "abstract
    superclass!! do not instantiate!!!".

    As a refactoring it's generally pretty useful. The code becomes easier
    to test and easier to read. But it's really not idiomatic at all, and
    it's very inelegant.

    --
    Giles Bowkett

    Blog: http://gilesbowkett.blogspot.com
    Portfolio: http://www.gilesgoatboy.org
    Tumblelog: http://giles.tumblr.com/
     
    Giles Bowkett, Oct 18, 2007
    #7
  8. Giles Bowkett

    Robert Dober Guest

    On 10/18/07, Giles Bowkett <> wrote:
    I'd go for modules but Robert is right too, if a class just is
    abstract by the way it is defined or refactored that's it, no way
    checking it's instantiation, no please. If you really feel that an
    entity shall not be instantiated than a Module seems to be the correct
    Ruby device.

    Cheers
    Robert

    --
    what do I think about Ruby?
    http://ruby-smalltalk.blogspot.com/
     
    Robert Dober, Oct 18, 2007
    #8
    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. Mark
    Replies:
    1
    Views:
    1,077
    Arvind
    Apr 28, 2004
  2. Replies:
    2
    Views:
    434
  3. Scott Harper

    Exception Superclasses

    Scott Harper, May 9, 2006, in forum: Java
    Replies:
    5
    Views:
    443
    Robert Klemme
    May 10, 2006
  4. Hallvard B Furuseth

    Finding a class' superclasses

    Hallvard B Furuseth, Aug 23, 2004, in forum: Python
    Replies:
    2
    Views:
    271
    Hallvard B Furuseth
    Aug 23, 2004
  5. Replies:
    26
    Views:
    787
Loading...

Share This Page