Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

abstract class

16 views
Skip to first unread message

hochherz

unread,
Dec 1, 2005, 12:49:25 PM12/1/05
to
hey

is there something like abstract classes in ruby?
somehow a class i could not create but wich is a superclass of some classes.

thanks
olaf

Phrogz

unread,
Dec 1, 2005, 12:58:10 PM12/1/05
to
> is there something like abstract classes in ruby?
> somehow a class i could not create but wich is a superclass of some classes.

You can always 'hide' the new:

irb(main):001:0> class Foo; def self.new; end; end
=> nil
irb(main):002:0> f = Foo.new
=> nil

Phrogz

unread,
Dec 1, 2005, 1:15:10 PM12/1/05
to
This question was also asked about 7 months ago. See the responses in:
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-talk/139546?139438-140406+split-mode-vertical

Daniel Schierbeck

unread,
Dec 1, 2005, 1:30:58 PM12/1/05
to

class Class
alias_method :__new__, :new
end

module NonInstantiable
def self.included(klass)
super
klass.module_eval do
def self.new
raise "Cannot instantiate abstract class #{self}"
end

def self.inherited(subklass)
subklass.module_eval do
def self.new(*args, &block)
__new__(*args, &block)
end
end
end
end
end
end

class BaseKlass
include NonInstantiable
end

class SubKlass < BaseKlass; end

puts SubKlass.new
puts BaseKlass.new

hochherz

unread,
Dec 1, 2005, 1:55:35 PM12/1/05
to
nice solution

Trans

unread,
Dec 1, 2005, 3:08:51 PM12/1/05
to
What do you use this for?

Daniel Schierbeck

unread,
Dec 1, 2005, 5:23:28 PM12/1/05
to
hochherz wrote:
> nice solution

Thank you very much :)

Trans wrote:
> What do you use this for?

I don't. But if I was to use it, that would be the way I'd do it.

Cheers,
Daniel

gwt...@mac.com

unread,
Dec 1, 2005, 5:49:10 PM12/1/05
to

On Dec 1, 2005, at 3:12 PM, Trans wrote:
> What do you use this for?

Sometimes you have an abstract class that models all the common
behavior but
to "complete" the functionality some methods need to be defined/
overridden
in the subclasses. In this situation, instantiating the abstract
class is
an error since it is only the subclasses that are "complete". I just
had
a use for this pattern and I decided to just make #new private:

class Base
class <<self; private :new; end
end

class Derived < Base
class <<self; public :new; end
end

The advantage to this is you can still have common initialization
code in
Base#initialize but it can only be accessed by calling super from
#initialize in a subclass.

It is similar to how Enumerable doesn't make sense as a class because
it isn't complete without #each being defined.


Phrogz

unread,
Dec 1, 2005, 6:33:59 PM12/1/05
to
> It is similar to how Enumerable doesn't make sense as a class because
> it isn't complete without #each being defined.

Which is also one thing that makes abstract classes not nearly as
useful in Ruby. Instead of creating an abstract class and inheriting
classes from it, create a module and mix it into the instantiable
classes.

0 new messages