In Ruby programming we use classes to represent real world objects and encapsulate behavior relevant to each object, respectively. We then create instances of those classes and call methods on them to make our programs run:
class Dog def bark "woof" end end puts Dog.new.bark
Classes can also inherit from other classes, creating an inheritance chain. When we inherit from a class we get access to all of the behavior that exists on the class we inherit from, as well as any classes that that class inherits from:
class Animal def eats? true end end class Dog < Animal def bark "woof" end end puts Dog.new.eats? puts Animal.new.eats?
Notice in the above example that we are able to create instances of both
Dog and call the method Animal.
Now the difference between these types of classes and an abstract class is that an abstract class can only be inherited from, you never create instances of the inheriting class directly. A good example of this in the ruby ecosystem is the Rails framework’s ActiveRecord library. You will notice you never see
ActiveRecord::Base.new called in a project, it is always only inherited from, thus making it “abstract”.