Abstract class


#1

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


#2

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


#3

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


#4

hochherz wrote:

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

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


#5

What do you use this for?


#6

nice solution


#7

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.


#8

hochherz wrote:

nice solution

Thank you very much :slight_smile:

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


#9

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.