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
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
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
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
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
What do you use this for?
nice solution
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.
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
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.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs