Multiple Inheritance Classes |
|
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:
These are some simple examples for single and multiple inheritance:
(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:
Everything together:
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