Multiple Inheritance Classes

lua-users home
wiki

A multiple-inheritance class library for Lua

This library is based on the general guidelines on OOP in Lua found in the PIL (Programming in Lua by Roberto Ierusalimschy) and it is also inspired by the class library in SimpleLuaClasses, which was taken as a starting point.

The idea is to implement a full-featured class system in C++ style, including multiple inheritance, shared (like C++ virtual) derivation and the correct handling of ambiguities and inherited attributes.

Summary

Brief summary using global named classes (see manual).

Standard derivation

class.A(P, Q)
class.B(P, Q)
class.C(A, B)

Cobj = C(constructor arguments ...)

Shared derivation

class.X(P, shared(Q))
class.Y(P, shared(Q))
class.Z(X, Y)

Zobj = Z(constructor arguments ...)

Class usage

class.Account()
function Account:__init(initial)  -- constructor
	self.balance = initial or 0
end
function Account:deposit(amount)
	self.balance = self.balance + amount
end

myAccount = Account(10.00)

class.NamedAccount(Account)
function NamedAccount:__init(name, initial)
	self.Account:__init(initial)
	self.name = name or 'anonymous'
end

myNamedAccount = NamedAccount('John', 10.00)

Object properties live in their respective objects.

myNamedAccount.name		== 'John'
myNamedAccount.balance		== nil 
myNamedAccount.Account.balance	== 10.00

Unambiguous base attributes are inherited. These two are equivalent:

myNamedAccount.Account:deposit(2.00) 
myNamedAccount:deposit(2.00)

Ambiguous attributes are not inherited:

class.SavingsAccount(Account)
class.CurrentAccount(Account)
class.CombinedAccount(SavingsAccount, CurrentAccount)

myCombinedAccount = CombinedAccount()
myCombinedAccount:deposit(2.00)  ← Error, deposit is nil

Qualification solves ambiguity:

myCombinedAccount.CurrentAccount:deposit(2.00)

There would exist a CombinedAccount:deposit() method if SavingsAccount and CurrentAccount derived from shared(Account). But it does not make sense in this case, since we really need two separate balances.

Files

Complete Word documentation and source code can be found here:

[Manual]
[Brief summary - named classes]
[Brief summary - unnamed classes]
[Source - named and unnamed classes]
[Source - only unnamed classes]

These are some simple examples for single and multiple inheritance:

[Single inheritance, unnamed classes]
[Multiple inheritance, unnamed classes] (1)
[Single inheritance, named classes]
[Multiple inheritance, named classes] (1)
[Multiple inheritance, named classes]

(1) In these examples you may play with options shared_meters (which enables shared inheritance) and keep_ambiguous (the latter must be defined before require).

These two simple classes illustrate indexing and metamethods:

[A tuple class with indexing]
[A set class with metamethods]

Everything together:

[Archive]

Lua files were edited with 4-space tabs.

Authors

Hugo Etchegoyen
hetchegoyen@hasar.com

Please add your data here if you modify this, thank you.

History

Version 2.04.04 - November 15, 2010
Included patches and ideas from Peter Schaefer (peter.schaefer@gmail.com) 
improving the efficiency of build(), __init() and other parts of the code.
The former remove_ambiguous() function was removed, improving the efficiency 
of both build() (instance creation) and mt:__call() (class creation). 
Ambiguities are now processed using the ambiguous_keys tables introduced by Peter.
Removed inheritance of class properties, which was inconsistent with
the way instance properties are handled (see pages 4-5 of the manual).
This was mostly harmless, but confusing. Now only methods are inherited.

Version 2.03 - February 6, 2007
Added support for indexing via __get() and __set() methods.
Added a couple of examples illustrating indexing and metamethods.

Version 2.02 - January 31, 2007
Added unclasslib.lua, a more efficient version of classlib.lua restricted
to unnamed classes.
Added compatibility with versions of Lua compiled without old-style vararg
support.

Version 2.01 - January 30, 2007
Added named classes and dot notation. Replaced the previous page
which was too long by a summary, details to be found in the
documentation, get it by clicking on the link above.
This version is backwards compatible with unnamed classes and the
square bracket notation, so it should run any previous code.

Version 1.03 - January 26, 2007
Changed the handling of constructors so that base objects not
explicitly initialized by them still get initialized by default.
Removed the source code from this page. Get it by clicking on 
the link above.

Version 1.02 - January 25, 2007
Added the possibility of not deleting ambiguous values from
classes and objects, useful for debugging.
Added a couple of simple test examples.

Version 1.01 - January 24, 2007
Minor polishing - modified some for loops to use ipairs()

Version 1.0 - January 24, 2007

See Also


RecentChanges · preferences
edit · history
Last edited November 18, 2010 5:20 pm GMT (diff)