Should an OO programming language support "multiple inheritance"? Let's define multiple inheritance first - starting from simple (single?) inheritance.
(Single) Inheritance.
I don't want to have to define each type of thing ("class of object") from scratch, so I'll define once class as being based on another. Then I don't need to (re)define all the code, or copy all the code from the base class - I can just say "here are the named blocks of code that are different".
So - for example - I can define a base type of "animal" and then define a "pet" that's based on an animal - i.e. pet inherits from animal, and the pet class only need contain those things that differ. Having set up a pet, I can set up a farm animal, a wild animal and a mythical animal in a similar way - just defining the changes which is much more efficient - especially when it comes to maintainance - than copying / repeating huge lots or code.
Multiple Inheritance
So a pet is based on an animal. Good - but let's say that I want to additionally base a pet on something else - such as a possession. Pets, Houses, cars all want to be based on possessions and share code, and that's what we mean by multiple inheritance.
But multiple inheritance is complicated to implement in a language, and it can make it very hard for the user to design his structures too. The complications start as soon as you try to create an object - in many languages, as soon as you say "I want a pet", the constructor for an animal will automatically be run as a pet is an animal - leading to a problem as to how it can start by building an animal, and start by building a possession.
Some languages such as C++, Python (
[example]) and Perl allow multiple inheritance - the language has the complexity, and the programmer who has a clear head may use it. But other languages do NOT support multiple inheritance. There are two alternatives - "Multiple inheritance very lite" and "Multiple Inheritance lite" if you like.
Multiple Inheritance very lite - Interfaces
One of the major reasons you might want multiple inheritance is to support polymorphism in languages where the data structures are strongly typed, or there are variable privacy rules. (In English - you might want to group types of thing by behaviours - such as an array of possessions, so that you can always call a piece of code "getinsurancevalue" even if the objects differ in detail and how they handle such a call).
Interfaces allow for this behaviour - you can define an interface in languages such as Java and PHP, and say that a class "implements an interface" ... and then you can have variables that contain a lot of very different - but all possession - objects.
Interfaces are indeed
very light. Code is not shared, so if there is to be common code it needs to be repeated. But sometimes they are a very good and sufficient soloution.
Multiple Inheritance lite - Mixins
A Mixin provides you with the ability to pull in common
code as well as a common interface into a class which also inherits from elsewhere - it's really like an interface, but rather more so as it does contain code as well. So in the case of our possession, common code to set and get the insurance value of a possession might be stored in a Mixin.
Both Python and Ruby support mixins, and at the end of last week I wrote a fresh example in Ruby to show them in use.
Here is the Ruby code used to ...
module Insurable
def setiv(newval)
@iv = newval
end
def getiv()
return @iv * 1.035
end
end
Here is how my House brings in that code ...
require "mixmodule"
class House
include Insurable
def initialize(numrooms, addy, numfloors, value)
@numrooms = numrooms
@addy = addy
@numfloors = numfloors
setiv(value)
end
def getfloors
return @numfloors
end
end
And here is how my pet brings it in ...
require "mixmodule"
class Pet
include Insurable
def initialize(name,breed,value)
@name = name
@breed = breed
setiv(value)
end
def getname
return @name
end
end
And - pulling that lot together ...
require("pet")
require("house")
things = []
things.push( Pet.new("Henry","Stick Insect",14))
things.push( Pet.new("Bruce","Koala",1250))
things.push( House.new(2,"London Apartment",1,500000))
things.push( House.new(12,"The Old Manse",3,125000))
things.each() do |item|
mread = item.getiv
print "#{item} #{mread}\n"
end
By its very nature, Multiple Inheritance and the lighter alternatives are useful in medium sided to larger applications rather than the small training examples that I write here. So this example of Mixins hasn't actually used the standard single inheritance that I have available to me .. to let pet inherit from anial, and house from residence.
(written 2010-04-11, updated 2010-04-14)
Associated topics are indexed under
Q907 - Object Orientation and General technical topics - Object Orientation: Design Techniques [3454] Your PHP website - how to factor and refactor to reduce growing pains - (2011-09-24)
[3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
[3085] Object Oriented Programming for Structured Programmers - conversion training - (2010-12-14)
[3063] Comments in and on Perl - a case for extreme OO programming - (2010-11-21)
[2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
[2953] Turning an exercise into the real thing with extreme programming - (2010-09-11)
[2889] Should Python classes each be in their own file? - (2010-07-27)
[2878] Program for reliability and efficiency - do not duplicate, but rather share and re-use - (2010-07-19)
[2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
[2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
[2747] Containment, Associative Objects, Inheritance, packages and modules - (2010-04-30)
[2741] What is a factory? - (2010-04-26)
[2523] Plan your application before you start - (2009-12-02)
[2501] Simples - (2009-11-12)
[2380] Object Oriented programming - a practical design example - (2009-08-27)
[2327] Planning! - (2009-08-08)
[2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
[2169] When should I use OO techniques? - (2009-05-11)
[1538] Teaching Object Oriented Java with Students and Ice Cream - (2008-02-12)
[1528] Object Oriented Tcl - (2008-02-02)
[1435] Object Oriented Programming in Perl - Course - (2007-11-18)
[1224] Object Relation Mapping (ORM) - (2007-06-09)
[1217] What are factory and singleton classes? - (2007-06-04)
[1047] Maintainable code - some positive advice - (2007-01-21)
[836] Build on what you already have with OO - (2006-08-17)
[831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
[747] The Fag Packet Design Methodology - (2006-06-06)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[534] Design - one name, one action - (2005-12-19)
[507] Introduction to Object Oriented Programming - (2005-11-27)
[236] Tapping in on resources - (2005-03-05)
[80] OO - real benefits - (2004-10-09)
R108 - Ruby - More Classes and Objects [3158] Ruby training - some fresh examples for string handling applications - (2011-02-05)
[3154] Changing a class later on - Ruby - (2011-02-02)
[3142] Private and Public - and things between - (2011-01-22)
[2980] Ruby - examples of regular expressions, inheritance and polymorphism - (2010-10-02)
[2623] Object Oriented Ruby - new examples - (2010-02-03)
[2620] Direct access to object variable (attributes) in Ruby - (2010-02-02)
[2616] Defining a static method - Java, Python and Ruby - (2010-02-01)
[2604] Tips for writing a test program (Ruby / Python / Java) - (2010-01-29)
[2603] Ruby objects - a primer - (2010-01-29)
[2601] Ruby - is_a? v instance_of? - what is the difference? - (2010-01-27)
[2292] Object Orientation in Ruby - intermediate examples - (2009-07-16)
[1587] Some Ruby programming examples from our course - (2008-03-21)
[184] MTBF of coffee machines - (2005-01-20)
C234 - C and C based languages - Further C++ Object Oriented features [3509] Operator Overloading, Exceptions, Pointers, References and Templates in C++ - new examples from our courses - (2011-11-06)
[3430] Sigils - the characters on the start of variable names in Perl, Ruby and Fortran - (2011-09-10)
[3238] Bradshaw, Ben and Bill. And some C and C++ pointers and references too. - (2011-04-09)
[3124] C++ - putting the language elements together into a program - (2011-01-08)
[3069] Strings, Garbage Collection and Variable Scope in C++ - (2010-11-25)
[3057] Lots of things to do with and within a C++ class - (2010-11-16)
[2849] What are C++ references? Why use them? - (2010-07-02)
[2673] Multiple Inheritance in C++ - a complete example - (2010-03-12)
[2576] What does const mean? C and C++ - (2010-01-15)
[2005] Variables and pointers and references - C and C++ - (2009-01-23)
[2004] Variable Scope in C++ - (2009-01-22)
[1819] Calling base class constructors - (2008-10-03)
[1159] It can take more that one plus one to get two. - (2007-04-22)
[802] undefined reference to typeinfo - C++ error message - (2006-07-15)
[801] Simple polymorphism example - C++ - (2006-07-14)
H108 - Objects in PHP [3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
[3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
[2922] Getting the OO design write - with PHP a example - (2010-08-14)
[2921] Does copying a variable duplicate the contents? - (2010-08-14)
[2774] PHP - Object Oriented Design in use - (2010-05-21)
[2680] Static class members in PHP - a documented example - (2010-03-16)
[2641] Object Oriented Programming in PHP - (2010-02-19)
[2632] Shipping a test harness with your class in PHP - (2010-02-12)
[2435] Serialization - storing and reloading objects - (2009-10-04)
[2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
[2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
[2171] Cleaning up redundant objects - (2009-05-11)
[2160] PHP - getclass v instanceof - (2009-05-07)
[1925] Introduction to Object Oriented Programming - (2008-12-06)
[1820] Sorting objects in PHP - (2008-10-04)
[1682] Accounts in PHP - an OO demo - (2008-06-19)
[1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
[1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
[1027] Cue the music, I'm happy. - (2007-01-09)
[720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
[485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
[421] Don't repeat code - use loops or functions - (2005-08-21)
[343] Should I use structured or object oriented? - (2005-06-10)
[205] PHP5 lets you say no - (2005-02-07)
[124] PHP v Java - (2004-11-20)
[67] Object Oriented Programming in PHP - (2004-09-29)
J906 - Java - Servlets in More Detail [3293] Distributing the server load - yet ensuring that each user return to the same system (Apache httpd and Tomcat) - (2011-05-18)
[3044] Changing a Servlet - more that just editing and compiling - (2010-11-12)
[2652] Reading and writing cookies in Java Servlets and JSPs - (2010-02-26)
[2183] Servlet life cycle, and Java Servlet variable scope - (2009-05-16)
[1909] javax.servlet cannot be resolved - how to solve - (2008-11-26)
[1550] Java (JSP and Servlet examples) live on our server - (2008-02-23)
[1495] Single login and single threaded models - Java and PHP - (2008-01-04)
[479] New servlet from old - (2005-10-28)
P218 - Perl - More Objects [3581] Perl - calls to methods that use => - what do they mean? - (2012-01-16)
[3377] What do I mean when I add things in Perl? - (2011-08-02)
[3098] Learning Object Orientation in Perl through bananas and perhaps Moose - (2010-12-21)
[3097] Making Perl class definitions more conventional and shorter - (2010-12-20)
[2972] Some more advanced Perl examples from a recent course - (2010-09-27)
[2876] Different perl examples - some corners I rarely explore - (2010-07-18)
[2811] Igloos melt in the summer, but houses do not - (2010-06-15)
[2651] Calculation within objects - early, last minute, or cached? - (2010-02-26)
[2427] Operator overloading - redefining addition and other Perl tricks - (2009-09-27)
[1949] Nuclear Physics comes to our web site - (2008-12-17)
[1665] Factory method example - Perl - (2008-06-04)
[1664] Example of OO in Perl - (2008-06-03)
[1320] Perl for Larger Projects - Object Oriented Perl - (2007-08-25)
[930] -> , >= and => in Perl - (2006-11-18)
[592] NOT Gone phishing - (2006-02-05)
[588] Changing @INC - where Perl loads its modules - (2006-02-02)
[531] Packages in packages in Perl - (2005-12-16)
[246] When to bless a Perl variable - (2005-03-15)
[227] Bellringing and Programming and Objects and Perl - (2005-02-25)
Y112 - Python - Objects - Intermediate [3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
[3472] Static variables in functions - and better ways using objects - (2011-10-10)
[3442] A demonstration of how many Python facilities work together - (2011-09-16)
[3002] A list of special method and attribute names in Python - (2010-10-17)
[2994] Python - some common questions answered in code examples - (2010-10-10)
[2905] Defining static methods in Python - (2010-08-05)
[2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
[2722] Mixins example in Python - (2010-04-14)
[2720] Multiple inheritance in Python - complete working example - (2010-04-14)
[2693] Methods that run on classes (static methods) in Python - (2010-03-25)
[2485] How do I set up a constant in Python? - (2009-10-31)
[2409] TypeError: super() argument 1 must be type, not classobj (Python) - (2009-09-18)
[2368] Python - fresh examples of all the fundamentals - (2009-08-20)
[1661] Equality, sameness and identity - Python - (2008-05-31)
[1644] Using a utility method to construct objects of different types - Python - (2008-05-17)
[1517] Python - formatting objects - (2008-01-24)
[1146] __new__ v __init__ - python constructor alternatives? - (2007-04-14)
[964] Practical polymorphism in action - (2006-12-04)
[903] Pieces of Python - (2006-10-23)
[477] Class, static and unbound variables - (2005-10-25)
[383] Overloading of operators on standard objects in Python - (2005-07-19)
[296] Using a Python dictionary as a holder of object attributes - (2005-04-30)
Some other Articles
Regular Expressions in PythonTraffic lights in PythonPython - access to variables in the outer scopeThe Multiple Inheritance Conundrum, interfaces and mixinsMelksham in PicturesUploading an image, document or pdf via a browser (php)A simple example - XML from a Ruby programHistory is all around usA more informed decision than ever before