# Abstract class

**URL:** <https://www.ruby-forum.com/t/abstract-class/91596>\
**Category:** Ruby\
**Created:** [December 1, 2005, 6:55pm UTC](https://www.ruby-forum.com/t/abstract-class/91596 "2005-12-01T18:55:48Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 6:55pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/1 "2005-12-01T18:55:48Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 7:20pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/2 "2005-12-01T19:20:08Z")

</div>

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](http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-talk/139546?139438-140406+split-mode-vertical)

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 7:48pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/3 "2005-12-01T19:48:36Z")

</div>

> 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

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 7:36pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/4 "2005-12-01T19:36:21Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 9:14pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/5 "2005-12-01T21:14:09Z")

</div>

What do you use this for?

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 8:00pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/6 "2005-12-01T20:00:46Z")

</div>

nice solution

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 11:52pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/7 "2005-12-01T23:52:33Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 1, 2005, 11:28pm UTC](https://www.ruby-forum.com/t/abstract-class/91596/8 "2005-12-01T23:28:07Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![hochherz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/85f322/32.png) [@hochherz](https://www.ruby-forum.com/u/hochherz)\
**Post date:** [December 2, 2005, 12:41am UTC](https://www.ruby-forum.com/t/abstract-class/91596/9 "2005-12-02T00:41:09Z")

</div>

> 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.
