Inheritance/Multiple: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(Add NetRexx implementation)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(83 intermediate revisions by 41 users not shown)
Line 1:
{{Task|Basic language learning}}
[[Category:Object oriented]]
[[Category:Type System]]
Multiple inheritance allows to specify that one [[classes | class]] is a subclass of several other classes. Some languages allow multiple [[inheritance]] for arbitrary classes, others restrict it to interfaces, some don't allow it at all.
 
Multiple inheritance allows to specify that one [[classes | class]] is a subclass of several other classes.
Write two classes (or interfaces) <tt>Camera</tt> and <tt>MobilePhone</tt>, then write a class <tt>CameraPhone</tt> which is both a <tt>Camera</tt> and a <tt>MobilePhone</tt>.
 
Some languages allow multiple [[inheritance]] for arbitrary classes, &nbsp; others restrict it to interfaces, &nbsp; some don't allow it at all.
 
 
;Task:
Write two classes (or interfaces) <tt>Camera</tt> and <tt>MobilePhone</tt>, &nbsp; then write a class <tt>CameraPhone</tt> which is both a <tt>Camera</tt> and a <tt>MobilePhone</tt>.
 
There is no need to implement any functions for those classes.
<br><br>
 
=={{header|Ada}}==
Ada 2005 has added interfaces, allowing a limited form of multiple inheritance.
<langsyntaxhighlight lang="ada">package Multiple_Interfaces is
type Camera is tagged null record;
type Mobile_Phone is limited Interface;
type Camera_Phone is new Camera and Mobile_Phone with null record;
end Multiple_Interfaces;</langsyntaxhighlight>
{{omit from|Modula-2}}
 
=={{header|Aikido}}==
Aikido does not support multiple inheritance, but does allow multiple implementation of interfaces.
<syntaxhighlight lang="aikido">interface Camera {
<lang aikido>
interface Camera {
}
 
Line 27 ⟶ 32:
 
class Camera_Phone implements Camera, Mobile_Phone {
}</syntaxhighlight>
}
 
</lang>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> INSTALL @lib$+"CLASSLIB"
DIM Camera{TakePicture}
Line 44 ⟶ 47:
PROC_inherit(CameraPhone{}, Camera{})
PROC_inherit(CameraPhone{}, MobilePhone{})
PROC_class(CameraPhone{})</langsyntaxhighlight>
 
=={{header|C}}==
C simulates Multiple Inheritance via Structures.
<syntaxhighlight lang="c">
typedef struct{
double focalLength;
double resolution;
double memory;
}Camera;
 
typedef struct{
double balance;
double batteryLevel;
char** contacts;
}Phone;
 
typedef struct{
Camera cameraSample;
Phone phoneSample;
}CameraPhone;
</syntaxhighlight>
 
=={{header|C sharp|C#}}==
In C# you may inherit from only one class, but you can inherit
from multiple interfaces.
Also, in C# it is standard practice to start all interface names
with a capital 'I' so I have altered the name of the interface.
In the example we inherit from a class and an interface.
 
<syntaxhighlight lang="csharp">interface ICamera {
// ...
}
 
class MobilePhone {
// ...
}
 
class CameraPhone: ICamera, MobilePhone {
// ...
}</syntaxhighlight>
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">class Camera
{
// ...
Line 62 ⟶ 105:
{
// ...
};</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
In C# you may inherit from only one class, but you can inherit from multiple interfaces. Also, in C# it is standard
practice to start all interface names with a capital 'I' so I have altered the name of the interface. In the example we
inherit from a class and an interface.
 
<lang csharp>interface ICamera {
// ...
}
 
class MobilePhone {
// ...
}
 
class CameraPhone: ICamera, MobilePhone {
// ...
}</lang>
 
=={{header|Clojure}}==
<langsyntaxhighlight Clojurelang="clojure">(defprotocol Camera)
 
(defprotocol MobilePhone)
Line 88 ⟶ 114:
(deftype CameraPhone []
Camera
MobilePhone)</langsyntaxhighlight>
 
=={{header|COBOL}}==
<syntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
CLASS-ID. Camera.
*> ...
END CLASS Camera.
IDENTIFICATION DIVISION.
CLASS-ID. Mobile-Phone.
*> ...
END CLASS Mobile-Phone.
IDENTIFICATION DIVISION.
CLASS-ID. Camera-Phone
INHERITS FROM Camera, Mobile-Phone.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
CLASS Camera
CLASS Mobile-Phone.
*> ...
END CLASS Camera-Phone.</syntaxhighlight>
 
=={{header|Common Lisp}}==
 
<langsyntaxhighlight lang="lisp">(defclass camera () ())
(defclass mobile-phone () ())
(defclass camera-phone (camera mobile-phone) ())</langsyntaxhighlight>
 
=={{header|D}}==
 
While D doesn'tdoes allownot have multiple base class inheritance, but you can inherit afterfrom multiple interfaces.
 
<langsyntaxhighlight lang="d">interface Camera {
// member function prototypes and static methods
}
Line 111 ⟶ 160:
// member function implementations for Camera,
// MobilePhone, and CameraPhone
}</langsyntaxhighlight>
 
D also supports template mixins and alias this (multiple alias this are planned) that allows various forms of static composition.
D also supports the [[non-virtual interface]] pattern, where an interface may have non-virtual methods with defined implementations.
 
<syntaxhighlight lang="d">interface Camera {
// A virtual function.
Image takePhoto();
 
// A non-virtual function.
final Image[] takeSeveralPhotos(int count) {
auto result = new Image[count];
foreach (ref img; result) {
img = takePhoto();
}
}
}</syntaxhighlight>
 
In addition, D's alias this feature allows one to create a type that, while it does not technically derive from two different classes, behaves as if it did.
 
<syntaxhighlight lang="d">class A {
string foo() {
return "I am an A.";
}
}
class B {
string foo() {
return "I am a B.";
}
}
 
class C : A {
string className = "C";
override string foo() {
return "I am a "~className~", and thus an A.";
}
@property
BWrapper asB() {
return new BWrapper();
}
alias asB this;
class BWrapper : B {
override string foo() {
return "I am a "~className~", disguised as a B.";
}
}
}
 
unittest {
import std.stdio : writeln;
auto c = new C();
A a = c;
B b = c;
writeln(a.foo());
writeln(b.foo());
}</syntaxhighlight>
 
You can currently only have a single alias this, but multiple alias this is planned. Nested alias this works today, but is somewhat finicky.
 
Lastly, D has template and string mixins. These can be used for static polymorphism, where a piece of code is written once and has a single definition, but is used in multiple places. It does not enable any sort of dynamic polymorphism that is not covered above.
 
<syntaxhighlight lang="d">template registerable() {
void register() { /* implementation */ }
}
 
string makeFunction(string s) {
return `string `~s~`(){ return "`~s~`";}`;
}
 
class Foo {
mixin registerable!();
mixin(makeFunction("myFunction"));
}
 
unittest {
import std.stdio : writeln;
Foo foo = new Foo;
foo.register();
writeln(foo.myFunction());
}</syntaxhighlight>
 
Using D's [[Compile-time calculation|CTFE]] and [[reflection]] capabilities, string mixins can copy the interface of other types, and thus be used for proxies and mocks.
 
=={{header|Delphi}}==
Delphi doesn't support multiple inheritance, but it does have multiple interfaces.
 
<syntaxhighlight lang="delphi">type
<lang Delphi>type
ICamera = Interface
// ICamera methods...
Line 128 ⟶ 258:
TCameraPhone = class(TInterfacedObject, ICamera, IMobilePhone)
// ICamera and IMobilePhone methods...
end;</langsyntaxhighlight>
 
=={{header|DWScript}}==
Line 136 ⟶ 266:
=={{header|E}}==
 
E does not have multiple inheritance as a built-in feature. In fact, E only has inheritance at all as a light syntactic sugar over delegation (message forwarding). However, using that facility it is possible to implement multiple inheritance.
In fact, E only has inheritance at all as a light syntactic sugar over delegation (message forwarding).
However, using that facility it is possible to implement multiple inheritance.
 
This is a quick simple implementation of multiple inheritance. It simply searches (depth-first and inefficiently) the inheritance tree for a method; it does not do anything about [[wp:Diamond inheritance|diamond inheritance]]. These shortcomings could be fixed if more powerful multiple inheritance were needed.
It simply searches (depth-first and inefficiently) the inheritance tree for a method;
it does not do anything about [[wp:Diamond inheritance|diamond inheritance]].
These shortcomings could be fixed if more powerful multiple inheritance were needed.
 
<langsyntaxhighlight lang="e">def minherit(self, supers) {
def forwarder match [verb, args] {
escape __return {
Line 162 ⟶ 297:
}
return forwarder
}</langsyntaxhighlight>
 
The task example:
 
<langsyntaxhighlight lang="e">def makeCamera(self) {
return def camera extends minherit(self, []) {
to takesPictures() { return true }
Line 188 ⟶ 323:
}
}
}</langsyntaxhighlight>
 
And testing that it works as intended:
 
<syntaxhighlight lang="e">
<lang e>
? def p := makeCameraPhone(p)
> [p.takesPictures(), p.makesCalls(), p.internalMemory()]
# value: [true, true, 33619968]</langsyntaxhighlight>
 
=={{header|Eiffel}}==
Having two class—one for CAMERA and the other for a MOBILE_PHONE ...
<lang eiffel >class
<syntaxhighlight lang="eiffel ">class
CAMERA
end</langsyntaxhighlight>
<langsyntaxhighlight lang="eiffel ">class
MOBILE_PHONE
end</langsyntaxhighlight>
=== Now Multiple Inherit ===
<lang eiffel >class
We can create a new CAMERA_PHONE, which inherits directly from both CAMERA and MOBILE_PHONE.
<syntaxhighlight lang="eiffel ">class
CAMERA_PHONE
inherit
CAMERA
MOBILE_PHONE
end</langsyntaxhighlight>
NOTE: There is no reasonable limit to the number of classes we can inherit from in a single class. The compiler helps us to navigate issues like repeated inheritance and the "diamond of death" easily and quickly.
 
=={{header|Elena}}==
ELENA only permits inheritance from one parent class. However, mixins are supported
<syntaxhighlight lang="elena">singleton CameraFeature
{
cameraMsg
= "camera";
}
class MobilePhone
{
mobileMsg
= "phone";
}
class CameraPhone : MobilePhone
{
dispatch() => CameraFeature;
}
public program()
{
var cp := new CameraPhone();
console.writeLine(cp.cameraMsg);
console.writeLine(cp.mobileMsg)
}</syntaxhighlight>
Alternatively a group object may be created
<syntaxhighlight lang="elena">import system'dynamic;
 
class CameraFeature
{
cameraMsg
= "camera";
}
 
class MobilePhone
{
mobileMsg
= "phone";
}
 
singleton CameraPhone
{
new() = new MobilePhone().mixInto(new CameraFeature());
}
 
public program()
{
var cp := CameraPhone.new();
 
console.writeLine(cp.cameraMsg);
console.writeLine(cp.mobileMsg)
}</syntaxhighlight>
 
=={{header|F_Sharp|F#}}==
A class can only inherit from one other class, but it can implement any number of interfaces.
 
<syntaxhighlight lang="fsharp">type Picture = System.Drawing.Bitmap // (a type synonym)
 
// an interface type
type Camera =
abstract takePicture : unit -> Picture
 
// an interface that inherits multiple interfaces
type Camera2 =
inherits System.ComponentModel.INotifyPropertyChanged
inherits Camera
 
// a class with an abstract method with a default implementation
// (usually called a virtual method)
type MobilePhone() =
abstract makeCall : int[] -> unit
default x.makeCall(number) = () // empty impl
 
// a class that inherits from another class and implements an interface
type CameraPhone() =
inherit MobilePhone()
interface Camera with
member x.takePicture() = new Picture(10, 10)</syntaxhighlight>
 
=={{header|Factor}}==
<syntaxhighlight lang="factor">TUPLE: camera ;
TUPLE: mobile-phone ;
UNION: camera-phone camera mobile-phone ;</syntaxhighlight>
 
=={{header|Fantom}}==
 
Fantom only permits inheritance from one parent class. However, Fantom supports 'mixins': a mixin is a collection of implemented methods to be added to the child class. Any number of mixins can be added to any given child class. It is an error for method names to conflict.
However, Fantom supports 'mixins': a mixin is a collection
of implemented methods to be added to the child class.
Any number of mixins can be added to any given child class.
It is an error for method names to conflict.
 
<syntaxhighlight lang="fantom">// a regular class
<lang fantom>
// a regular class
class Camera
{
Line 247 ⟶ 474:
echo (cp.mobileMsg)
}
}</syntaxhighlight>
}
</lang>
 
=={{header|F_Sharp|F#}}==
A class can only inherit from one other class, but it can implement any number of interfaces.
 
=={{header|Forth}}==
<lang fsharp>type Picture = System.Drawing.Bitmap // (a type synonym)
 
Standard Forth does not supply high level data structures
// an interface type
or functions. But there is library code written by vendors
type Camera =
or users. For object programming with multiple inheritance
abstract takePicture : unit -> Picture
there is a user-supplied ANS compatible extension.
 
https://github.com/DouglasBHoffman/FMS2
// a class with an abstract method with a default implementation
Download the FMSMI package to run the
// (usually called a virtual method)
following example code.
type MobilePhone() =
abstract makeCall : int[] -> unit
default x.makeCall(number) = () // empty impl
 
<syntaxhighlight lang="forth">
// a class that inherits from another class and implements an interface
 
type CameraPhone() =
\ define class camera with method say:
inherit MobilePhone()
:class camera
interface Camera with
:m say: ." camera " ;m
member x.takePicture() = new Picture(10, 10)</lang>
;class
 
\ define class phone with method say:
:class phone
:m say: ." phone " ;m
;class
 
\ define cameraPhone phone with method say:
\ class cameraPhone inherits from both class
\ camera and class phone
:class cameraPhone super{ camera phone }
:m say: self say: \ method conflicts in superclasses
\ are resolved by left-to-right order
\ so self say: will call the say: method
\ from class camera
super> phone say: \ super> phone is used to direct
\ this say: method to use the
\ method from class phone
;m
;class
 
cameraPhone cp \ instantiate a cameraPhone object named cp
 
cp say: \ send the say: message to cp
 
\ output:
camera phone
</syntaxhighlight>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
' FB does not currently support multiple inheritance. Composition has to be used instead if one wants
' to (effectively) inherit from more than one class. In some cases, this might arguably be a better
' solution anyway.
 
Type Camera Extends Object ' if virtual methods etc needed
' ...
End Type
 
Type Phone Extends Object
' ...
End Type
 
Type CameraPhone Extends Phone ' single inheritance
cam As Camera ' using composition here
' other stuff
End Type</syntaxhighlight>
 
=={{header|Go}}==
Go abandons traditional object oriented concepts of inheritance hierarchies, yet it does have features for composing both structs and interfaces.
<langsyntaxhighlight lang="go">// Example of composition of anonymous structs
package main
 
Line 303 ⟶ 574:
htc.sim = "XYZ"
fmt.Println(htc)
}</langsyntaxhighlight>
Output: {{out}} (Note sensor field still blank)
<pre>{{zoom } {XYZ 3.14}}</pre>
<pre>
<syntaxhighlight lang="go">// Example of composition of interfaces.
{{zoom } {XYZ 3.14}}
</pre>
<lang go>// Example of composition of interfaces.
// Types implement interfaces simply by implementing functions.
// The type does not explicitly declare the interfaces it implements.
Line 354 ⟶ 623:
i.photo()
i.call()
}</syntaxhighlight>
}
{{out}}
</lang>
Output:
<pre>
snap
omg!
</pre>
 
=={{header|Groovy}}==
Same inheritance rules as [[Inheritance/Multiple#Java|Java]].
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">class Camera a
class MobilePhone a
class (Camera a, MobilePhone a) => CameraPhone a</langsyntaxhighlight>
 
==Icon and {{header|Unicon}}==
{{omit from|Icon}}
Icon does not support classes or inheritance. An intermediate language called Idol was developed as proof of concept for extending Icon. This became one of the major addons contributing to Unicon.
An intermediate language called Idol was developed as proof of concept
for extending Icon.
This became one of the major addons contributing to Unicon.
 
<syntaxhighlight lang="unicon">class Camera (instanceVars)
<lang unicon>
class Camera (instanceVars)
# methods...
# initializer...
Line 385 ⟶ 658:
# methods...
# initialiser...
end</langsyntaxhighlight>
 
=={{header|Io}}==
<syntaxhighlight lang="io">Camera := Object clone
Camera click := method("Taking snapshot" println)
 
MobilePhone := Object clone
MobilePhone call := method("Calling home" println)
 
CameraPhone := Camera clone
CameraPhone appendProto(MobilePhone)
 
myPhone := CameraPhone clone
myPhone click // --> "Taking snapshot"
myPhone call // --> "Calling home"</syntaxhighlight>
In Io each object has an internal list of prototype objects it inherits from. You can add to this list with <code>appendProto</code>.
 
=={{header|Ioke}}==
<langsyntaxhighlight lang="ioke">Camera = Origin mimic
MobilePhone = Origin mimic
CameraPhone = Camera mimic mimic!(MobilePhone)</langsyntaxhighlight>
 
=={{header|J}}==
<langsyntaxhighlight lang="j">coclass 'Camera'
 
create=: verb define
Line 424 ⟶ 712:
destroy=: codestroy
 
NB. additional camera-phone methods go here</langsyntaxhighlight>
The adverb Fix (f.) is needed as shown so the superclass constructors get executed in the object, not in the superclass.
get executed in the object, not in the superclass.
 
=={{header|Java}}==
Java does not allow multiple inheritance, but you can "implement" multiple interfaces. All methods in interfaces are abstract (they don't have an implementation). When you implement an interface you need to implement the specified methods.
When you implement an interface you need to implement the specified methods.
<lang java>public interface Camera{
<syntaxhighlight lang="java">public interface Camera{
//functions here with no definition...
//ex:
//public void takePicture();
}</langsyntaxhighlight>
<langsyntaxhighlight lang="java">public interface MobilePhone{
//functions here with no definition...
//ex:
//public void makeCall();
}</langsyntaxhighlight>
<langsyntaxhighlight lang="java">public class CameraPhone implements Camera, MobilePhone{
//functions here...
}</langsyntaxhighlight>
 
{{omit|Julia}}
 
=={{header|Julia}}==
 
Julia supports inheritance via abstract types. In Julia, multiple dispatch allows objects of different types to have the same function interfaces. Julia also can support traits via parameters in type declarations or with macros. This makes multiple inheritance in Julia mostly unnecessary, except for the inconvenience of composing the data in a mixed type when declaring multiple similar types, for which there are macros.<br /> <br />For example, the functions <code> dialnumber(equipment, name) </code> and <code> video(equipment, filename) </code> could be used as generic interfaces to implement methods for a <code>Telephone</code>, a <code>Camera</code>, and a <code>SmartPhone</code>, and Julia would dispatch according to the type of the equipment.<syntaxhighlight lang="julia">
abstract type Phone end
 
struct DeskPhone <: Phone
book::Dict{String,String}
end
 
abstract type Camera end
 
struct kodak
roll::Vector{Array{Int32,2}}
end
 
struct CellPhone <: Phone
book::Dict{String,String}
roll::Vector{AbstractVector}
end
 
function dialnumber(phone::CellPhone)
println("beep beep")
end
 
function dialnumber(phone::Phone)
println("tat tat tat tat")
end
 
function snap(camera, img)
println("click")
push!(camera.roll, img)
end
 
dphone = DeskPhone(Dict(["information" => "411"]))
cphone = CellPhone(Dict(["emergency" => "911"]), [[]])
 
dialnumber(dphone)
dialnumber(cphone)
</syntaxhighlight>{{output}}<pre>
tat tat tat tat
beep beep
</pre>
 
=={{header|Kotlin}}==
Interfaces in Kotlin are very similar to Java 8. They can contain declarations of abstract methods, as well as method implementations.<br/>
What makes them different from abstract classes is that interfaces cannot store state. They can have properties but these need
to be abstract or to provide accessor implementations.
 
<syntaxhighlight lang="scala">interface Camera {
val numberOfLenses : Int
}
 
interface MobilePhone {
fun charge(n : Int) {
if (n >= 0)
battery_level = (battery_level + n).coerceAtMost(100)
}
 
var battery_level : Int
}
 
data class CameraPhone(override val numberOfLenses : Int = 1, override var battery_level: Int) : Camera, MobilePhone
data class TwinLensCamera(override val numberOfLenses : Int = 2) : Camera
 
fun main(args: Array<String>) {
val c = CameraPhone(1, 50)
println(c)
c.charge(35)
println(c)
c.charge(78)
println(c)
println(listOf(c.javaClass.superclass) + c.javaClass.interfaces)
val c2 = TwinLensCamera()
println(c2)
println(listOf(c2.javaClass.superclass) + c2.javaClass.interfaces)
}</syntaxhighlight>
{{out}}
<pre>CameraPhone(numberOfLenses=1, battery_level=50)
CameraPhone(numberOfLenses=1, battery_level=85)
CameraPhone(numberOfLenses=1, battery_level=100)
[class java.lang.Object, interface multiple_inheritance.Camera, interface multiple_inheritance.MobilePhone]
TwinLensCamera(numberOfLenses=2)
[class java.lang.Object, interface multiple_inheritance.Camera]</pre>
 
=={{header|Lasso}}==
Lasso only allow single inheritance.
But it supports the use of multiple traits
and trays hand down the methods it has implemented provided that the type
fulfills the requirements for the trait. [http://lassoguide.com/language/traits.html http://lassoguide.com/language/traits.html]
<syntaxhighlight lang="lasso">define trait_camera => trait {
require zoomfactor
 
provide has_zoom() => {
return .zoomfactor > 0
}
 
}
 
define trait_mobilephone => trait {
require brand
 
provide is_smart() => {
return .brand == 'Apple'
}
 
}
 
define cameraphone => type {
 
trait {
import trait_camera, trait_mobilephone
}
 
data public zoomfactor::integer = 0,
public brand::string
 
}
 
local(mydevice = cameraphone)
 
#mydevice -> brand = 'Apple'
#mydevice -> zoomfactor = 0
 
#mydevice -> has_zoom
'<br />'
#mydevice -> is_smart</syntaxhighlight>
-> false
 
true
 
=={{header|Latitude}}==
 
Latitude is a prototype-oriented language, and every object can have only one prototype. As such, multiple inheritance in the usual sense is impossible in Latitude. The behavior of multiple (implementation) inheritance can be approximated with mixins.
 
<syntaxhighlight lang="latitude">Camera ::= Mixin clone.
MobilePhone ::= Mixin clone.
 
CameraPhone ::= Object clone.
Camera inject: CameraPhone.
MobilePhone inject: CameraPhone.</syntaxhighlight>
 
In order to add functionality to either of the mixins, the <code>interface</code> slot of the mixin must be modified to include the name of the new method. Injecting a mixin makes a copy of the methods, as opposed to traditional (prototype) inheritance in which method calls are delegated.
 
=={{header|Lingo}}==
Lingo does not support multiple inheritance. But its slightly idiosyncratic inheritance implementation based on "ancestors" allows to assign/change inheritance relations at runtime. So a similar (but not identical) effect can be achieved by something like this:
<syntaxhighlight lang="lingo">-- parent script "Camera"
property resolution
 
on new (me)
me.resolution = "1024x768"
return me
end
 
on snap (me)
put "SNAP!"
end</syntaxhighlight>
 
<syntaxhighlight lang="lingo">-- parent script "MobilePhone"
property ringtone
 
on new (me)
me.ringtone = "Bell"
return me
end
 
on ring (me, n)
repeat with i = 1 to n
put "RING!!!"
end repeat
end</syntaxhighlight>
 
<syntaxhighlight lang="lingo">-- parent script "CameraPhone"
property ancestor
 
on new (me)
c = script("Camera").new()
mp = script("MobilePhone").new()
 
-- make the Camera instance a parent of the MobilePhone instance
mp.setProp(#ancestor, c)
 
-- make the MobilePhone instance a parent of this CameraPhone instance
me.ancestor = mp
 
return me
end</syntaxhighlight>
 
Usage:
<syntaxhighlight lang="lingo">cp = script("CameraPhone").new()
 
cp.snap()
-- "SNAP!"
 
cp.ring(3)
-- "RING!!!"
-- "RING!!!"
-- "RING!!!"
 
put cp.resolution
-- "1024x768"
 
put cp.ringtone
-- "Bell"</syntaxhighlight>
 
=={{header|Logtalk}}==
Logtalk supports multiple inheritance.
Logtalk supports multiple inheritance. There is no "class" keyword in Logtalk; an "object" keyword is used instead (Logtalk objects play the role of classes, meta-classes, instances, or prototypes depending on the relations with other objects).
There is no "class" keyword in Logtalk;
<lang logtalk>:- object(camera,
an "object" keyword is used instead (Logtalk objects play the role of classes, meta-classes, instances, or prototypes depending on the relations with other objects).
<syntaxhighlight lang="logtalk">:- object(camera,
...).
...
:- end_object.</langsyntaxhighlight>
 
<langsyntaxhighlight lang="logtalk">:- object(mobile_phone,
...).
...
:- end_object.</langsyntaxhighlight>
 
<langsyntaxhighlight lang="logtalk">:- object(camera_phone,
specializes(camera, mobile_phone),
...).
...
:- end_object.</langsyntaxhighlight>
 
=={{header|Lua}}==
Lua is prototype-based. A table cannot have more than one metatable, but it can reference more than one in its __index metamethod, by making it a closure.
but it can reference more than one in its __index metamethod,
by making it a closure.
 
<syntaxhighlight lang="lua">function setmetatables(t,mts) --takes a table and a list of metatables
<lang lua>
function setmetatables(t,mts) --takes a table and a list of metatables
return setmetatable(t,{__index = function(self, k)
--collisions are resolved in this implementation by simply taking the first one that comes along.
Line 477 ⟶ 976:
camera = {}
mobilephone = {}
cameraphone = setemetatables({},{camera,mobilephone})</syntaxhighlight>
 
=={{header|M2000 Interpreter}}==
</lang>
<syntaxhighlight lang="m2000 interpreter">
Module CheckIt {
Class Camera {
Private:
cameratype$
Class:
module Camera (.cameratype$){
}
}
\\ INHERITANCE AT CODE LEVEL
Class MobilePhone {
Private:
model$
Class:
module MobilePhone (.model$) {
}
}
Class CameraPhone as Camera as MobilePhone {
Module CameraPhone ( .model$, .cameratype$) {
}
}
CP1 =CameraPhone("X-15", "OBSCURE")
Print CP1 is type CameraPhone = true
Print CP1 is type Camera = true
Print CP1 is type MobilePhone = true
 
\\ INHERITANCE AT OBJECT LEVEL
CP2 = MobilePhone("X-9") with Camera("WIDE")
\\ CP3 has no type
Group CP3 {
Module PrintAll {
If this is type Camera and this is type MobilePhone then
Print .model$, .cameratype$
Else
Print "Nothing to print"
End if
}
}
CP3.PrintAll ' Nothing to print
\\ using pointers and prepate inheritance at object level
CP->(CP1 with CP3)
CP=>PrintAll
CP->(CP2 with CP3)
CP=>PrintAll
}
CheckIt
</syntaxhighlight>
 
=={{header|Nemerle}}==
Like C#, Nemerle only allows psuedopseudo-multiple inheritance through interfaces. In Nemerle, the base class must be listed before any interfaces.
In Nemerle, the base class must be listed before any interfaces.
<lang nemerle>interface ICamera {
<syntaxhighlight lang="nemerle">interface ICamera {
// ...
}
Line 493 ⟶ 1,040:
class CameraPhone: MobilePhone, ICamera {
// ...
}</langsyntaxhighlight>
 
=={{header|NetRexx}}==
Like [[Java]], NetRexx doesn't allow true multiple inheritance but instead restricts that capability to interfaces. NetRexx permits the ''implementation'' of multiple interfaces. All methods in interfaces are implicitly abstract, thus when you implement an interface you must implement its specified methods.
NetRexx permits the ''implementation'' of multiple interfaces.
All methods in interfaces are implicitly abstract, thus when you implement an interface you must implement its specified methods.
 
In this sample the class/interface names are augmented over those required in the task to prevent namespace pollution. The sample also provides a complete working implementation to demonstrate the capability.
The sample also provides a complete working implementation to demonstrate the capability.
<lang NetRexx>/* NetRexx */
<syntaxhighlight lang="netrexx">/* NetRexx */
options replace format comments java crossref symbols binary
 
Line 544 ⟶ 1,094:
return shutter
method call() public
return ringTone</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 551 ⟶ 1,100:
Object @7F546C85 [RInheritMultiple_CameraPhone] is a RInheritMultiple_MobilePhone
click...
ring...</pre>
 
</pre>
=={{header|Nim}}==
nim does not support multiple inheritance (version<=1.4.6). It is just a demonstration of the procedure reloading nature of nim code.
<syntaxhighlight lang="nim">type
Camera = ref object of RootObj
MobilePhone = ref object of RootObj
CameraPhone = object
camera: Camera
phone: MobilePhone
proc `is`(cp: CameraPhone, t: typedesc): bool =
for field in cp.fields():
if field of t:
return true
var cp: CameraPhone
echo(cp is Camera)
echo(cp is MobilePhone)</syntaxhighlight>
{{out}}
<pre>
true
true</pre>
 
=={{header|Objective-C}}==
Like Java, Objective-C does not allow multiple inheritance, but a class can "conform to" multiple protocols. All methods in protocols are abstract (they don't have an implementation). When you conform to a protocol you need to implement the specified methods.
but a class can "conform to" multiple protocols.
All methods in protocols are abstract (they don't have an implementation).
When you conform to a protocol you need to implement the specified methods.
 
If you simply want to combine the functionality (method implementations) of multiple classes, you can use message forwarding to mimic the functionality of those classes without actually inheriting them, as described in [http://support.apple.com/kb/TA45894 this guide]:
of multiple classes, you can use message forwarding to mimic the functionality of those classes without actually inheriting them, as described in [http://support.apple.com/kb/TA45894 this guide]:
 
<langsyntaxhighlight lang="objc">@interface Camera : NSObject {
}
@end
Line 581 ⟶ 1,153:
@implementation CameraPhone
 
-(idinstancetype)init {
if ((self = [super init])) {
camera = [[Camera alloc] init];
Line 587 ⟶ 1,159:
}
return self;
}
 
-(void)dealloc {
[camera release];
[phone release];
[super dealloc];
}
 
Line 603 ⟶ 1,169:
else
[self doesNotRecognizeSelector:aSelector];
}
 
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
return [camera methodSignatureForSelector:aSelector]
?: [phone methodSignatureForSelector:aSelector]
?: [super methodSignatureForSelector:aSelector];
}
 
Line 611 ⟶ 1,183:
}
 
@end</langsyntaxhighlight>
 
Caveat: the CameraPhone class will still technically not inherit from either the Camera or MobilePhone classes, so testing a CameraPhone object with <code>-isKindOfClass:</code> with the Camera or MobilePhone classes will still fail.
either the Camera or MobilePhone classes, so testing a CameraPhone object with <code>-isKindOfClass:</code> with the Camera or MobilePhone classes will still fail.
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">class camera =
object (self)
(*functions go here...*)
end</langsyntaxhighlight>
<langsyntaxhighlight lang="ocaml">class mobile_phone =
object (self)
(*functions go here...*)
end</langsyntaxhighlight>
<langsyntaxhighlight lang="ocaml">class camera_phone =
object (self)
inherit camera
inherit mobile_phone
(*functions go here...*)
end</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
Oforth does not implement multiple inheritance. It allows only one parent class.
 
Oforth implements properties (like Comparable, Indexable, ...). A property can have attributes and methods.
A class can have multiple properties.
 
If Camera and MobilePhone are designed as properties, we can write :
 
<syntaxhighlight lang="oforth">Property new: Camera
Property new: MobilePhone
 
Object Class new: CameraPhone
CameraPhone is: Camera
CameraPhone is: MobilePhone</syntaxhighlight>
 
=={{header|ooRexx}}==
ooRexx classes have a single superclass and can inherit from multiple mixins. Mixins are more that just interfaces. They can contain concrete method implementations and also create instance variables (scoped as private variables to the mixin methods).
Mixins are more than just interfaces.
<lang ooRexx>
They can contain concrete method implementations and also create instance variables (scoped as private variables to the mixin methods).
<syntaxhighlight lang="oorexx">
-- inherited classes must be created as mixinclasses.
::class phone mixinclass object
Line 647 ⟶ 1,238:
-- or
 
::class cameraphone2 subclass camera inherit phone</syntaxhighlight>
</lang>
 
=={{header|OxygenBasic}}==
<langsyntaxhighlight lang="oxygenbasic">class Camera
class Camera
string cbuf
method TakePhoto()
Line 675 ⟶ 1,264:
 
cp.ViewPhoto
cp.MakeCall</syntaxhighlight>
</lang>
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">class Camera end
 
class MobilePhone end
 
class CameraPhone from Camera MobilePhone end</langsyntaxhighlight>
 
=={{header|Pascal}}==
Line 689 ⟶ 1,277:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">package Camera;
#functions go here...
1;</langsyntaxhighlight>
 
<langsyntaxhighlight lang="perl">package MobilePhone;
#functions go here...
1;</langsyntaxhighlight>
 
<langsyntaxhighlight lang="perl">package CameraPhone;
use Camera;
use MobilePhone;
@ISA = qw( Camera MobilePhone );
#functions go here...
1;</langsyntaxhighlight>
 
or
 
<langsyntaxhighlight lang="perl">package CameraPhone;
use base qw/Camera MobilePhone/;
#functions go here...</langsyntaxhighlight>
 
The same using the [http://search.cpan.org/perldoc?MooseX::Declare MooseX::Declare] extention:
<langsyntaxhighlight lang="perl">use MooseX::Declare;
 
class Camera {
Line 721 ⟶ 1,309:
class CameraPhone extends(Camera, MobilePhone) {
# methods ...
}</langsyntaxhighlight>
 
=={{header|Perl 6}}==
 
{{works with|Rakudo|2012.06}}
<lang perl6>class Camera {}
class MobilePhone {}
class CameraPhone is Camera is MobilePhone {}
 
=={{header|Phix}}==
say CameraPhone.^mro; # undefined type object
{{libheader|Phix/Class}}
say CameraPhone.new.^mro; # instantiated object</lang>
Needs 0.8.1+
===inheritance===
The programmer is expected to assume complete responsibility (away from the compiler) for checking/resolving any conflicts.
<syntaxhighlight lang="phix">
class Camra
string name = "nikkon"
end class
class Mobile
-- string name = "nokia" -- oops!
string mane = "nokia" -- ok!
end class
class CamraPhone extends Camra,Mobile
procedure show() ?{name,mane} end procedure
end class
CamraPhone cp = new()
cp.show()</syntaxhighlight>
{{out}}
<pre>
<pre>CameraPhone() Camera() MobilePhone() Any() Mu()
{"nikkon","nokia"}
CameraPhone() Camera() MobilePhone() Any() Mu()</pre>
</pre>
 
===composition===
The <tt>.^mro</tt> is not an ordinary method call, but a call to the object's metaobject that returns the method resolution order for this type.
The programmer is expected to assume complete responsibility for invoking new() appropriately.<br>
The example below shows four different approaches to invoking all the new() that are needed (one pair commented out).<br>
Note that invoking new() inside a class definition creates shared references to a single instance.<br>
The compiler demands to be explicitly told what the inner/inlined new() on cp2 are actually for.
<syntaxhighlight lang="phix">class Camera
public string name = "nikkon"
end class
class MobilePhone
public string name = "nokia" -- (clash no more)
end class
class CameraPhone
-- Camera c = new()
-- MobilePhone m = new()
public Camera c
public MobilePhone m
procedure show() ?{c.name,m.name} end procedure
end class
Camera c = new({"canon"})
MobilePhone m = new()
CameraPhone cp1 = new({c,m}),
cp2 = new({new("Camera"),new("MobilePhone")}),
cp3 = new() -- (internal/shared/NULL c,m)
cp3.c = new() -- (obviously c must be public)
cp3.m = new({"LG20"}) -- "" m "" ""
cp1.show()
cp2.show()
cp3.show() -- crashes without internal/above new()</syntaxhighlight>
{{out}}
<pre>
{"canon","nokia"}
{"nikkon","nokia"}
{"nikkon","LG20"}
</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(class +Camera)
(class +MobilePhone)
 
(class +CameraPhone +MobilePhone +Camera)</lang>
</syntaxhighlight>
 
=={{header|Pop11}}==
<langsyntaxhighlight lang="pop11">;;; load object support
lib objectclass;
 
Line 759 ⟶ 1,390:
enddefine;
 
;;; methods go here</langsyntaxhighlight>
 
=={{header|PowerShell}}==
{{works with|PowerShell|5}}
<syntaxhighlight lang="powershell">
class Camera {}
class MobilePhone {}
class CameraPhone : Camera, MobilePhone {}
</syntaxhighlight>
 
=={{header|PureBasic}}==
Using the open-source precompiler [http://www.development-lounge.de/viewtopic.php?t=5915 SimpleOOP].
<langsyntaxhighlight PureBasiclang="purebasic">Class Camera
EndClass
 
Line 770 ⟶ 1,409:
 
Class CameraMobile Extends Camera Extends Mobil
EndClass</langsyntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">class Camera:
pass #functions go here...</langsyntaxhighlight>
 
<langsyntaxhighlight lang="python">class MobilePhone:
pass #functions go here...</langsyntaxhighlight>
 
<langsyntaxhighlight lang="python">class CameraPhone(Camera, MobilePhone):
pass #functions go here...</langsyntaxhighlight>
 
=={{header|Racket}}==
 
Racket allows multiple inheritance with interfaces, but not classes. Mixins can be used to achieve some of the benefits of multiple inheritance.
Mixins can be used to achieve some of the benefits of multiple inheritance.
 
<langsyntaxhighlight lang="racket">#lang racket
#lang racket
 
(define camera<%> (interface ()))
Line 796 ⟶ 1,435:
(super-new)
;; implement methods here
))</syntaxhighlight>
 
</lang>
=={{header|Raku}}==
(formerly Perl 6)
 
{{works with|Rakudo|2012.06}}
<syntaxhighlight lang="raku" line>class Camera {}
class MobilePhone {}
class CameraPhone is Camera is MobilePhone {}
 
say CameraPhone.^mro; # undefined type object
say CameraPhone.new.^mro; # instantiated object</syntaxhighlight>
{{out}}
<pre>CameraPhone() Camera() MobilePhone() Any() Mu()
CameraPhone() Camera() MobilePhone() Any() Mu()</pre>
 
The <tt>.^mro</tt> is not an ordinary method call,
but a call to the object's metaobject
that returns the method resolution order for this type.
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Inheritance/Multiple
 
mergemethods(:CameraPhone,:MobilePhone)
 
o1 = new CameraPhone
? o1
? o1.testCamera()
? o1.testMobilePhone()
 
func AddParentClassAttributes oObject,cClass
# Add Attributes
cCode = "oTempObject = new " + cClass
eval(cCode)
for cAttribute in Attributes(oTempObject)
AddAttribute(oObject,cAttribute)
cCode = "oObject." + cAttribute + " = oTempObject." + cAttribute
eval(cCode)
next
 
class Camera
Name = "Camera"
func testCamera
? "Message from testCamera"
 
class MobilePhone
Type = "Android"
func testMobilePhone
? "Message from MobilePhone"
 
class CameraPhone from Camera
 
# Add MobilePhone Attributes
AddParentClassAttributes(self,:MobilePhone)
</syntaxhighlight>
Output:
<pre>
name: Camera
type: Android
Message from testCamera
Message from MobilePhone
</pre>
 
=={{header|Ruby}}==
Ruby does not have multiple inheritance, but you can mix modules into classes:
<langsyntaxhighlight lang="ruby">module Camera
# define methods here
end
Line 810 ⟶ 1,511:
include Camera
# define methods here
end</langsyntaxhighlight>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">trait Camera {}
trait MobilePhone {}
trait CameraPhone: Camera + MobilePhone {}</syntaxhighlight>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">trait Camera
trait MobilePhone
class CameraPhone extends Camera with MobilePhone</syntaxhighlight>
 
=={{header|Self}}==
Self is a class-free, object-oriented language, and as such, it uses prototypal inheritance instead of classical inheritance. This is an example of the relevant excerpts from a Self transporter fileout. Normally the object tree would be built and navigated within the graphical Self environment.
<syntaxhighlight lang="self">camera = ()</syntaxhighlight>
<syntaxhighlight lang="self">mobilePhone = ()</syntaxhighlight>
<syntaxhighlight lang="self">cameraPhone = (| cameraParent* = camera. mobilePhoneParent* = mobilePhone |)</syntaxhighlight>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">class Camera {};
class MobilePhone {};
class CameraPhone << Camera, MobilePhone {};</syntaxhighlight>
 
=={{header|Slate}}==
<langsyntaxhighlight lang="slate">define: #Camera.
define: #MobilePhone.
define: #CameraPhone &parents: {Camera. MobilePhone}.</langsyntaxhighlight>
 
=={{header|Swift}}==
Like Objective-C, Swift does not allow multiple inheritance. However, you can conform to multiple protocols.
<syntaxhighlight lang="swift">protocol Camera {
}
 
protocol Phone {
}
 
class CameraPhone: Camera, Phone {
}</syntaxhighlight>
 
=={{header|Tcl}}==
{{works with|Tcl|8.6}} or {{libheader|TclOO}}
<langsyntaxhighlight lang="tcl">package require TclOO
 
oo::class create Camera
Line 826 ⟶ 1,562:
oo::class create CameraPhone {
superclass Camera MobilePhone
}</langsyntaxhighlight>
 
=={{header|Wren}}==
Wren does not support either multiple inheritance or interfaces.
 
However, multiple inheritance can be simulated by inheriting from a single class and then embedding objects of other classes and wrapping their methods.
<syntaxhighlight lang="wren">class Camera {
construct new() {}
snap() { System.print("taking a photo") }
}
 
class Phone {
construct new() {}
call() { System.print("calling home") }
}
 
class CameraPhone is Camera {
construct new(phone) { _phone = phone } // uses composition for the Phone part
// inherits Camera's snap() method
// Phone's call() method can be wrapped
call() { _phone.call() }
}
 
var p = Phone.new()
var cp = CameraPhone.new(p)
cp.snap()
cp.call()</syntaxhighlight>
 
{{out}}
<pre>
taking a photo
calling home
</pre>
 
=={{header|zkl}}==
<syntaxhighlight lang="zkl">class Camera{} class MobilePhone{}
class CameraPhone(Camera,MobilePhone){}
CameraPhone.linearizeParents</syntaxhighlight>
{{out}}Show the class search order
<pre>L(Class(CameraPhone),Class(Camera),Class(MobilePhone))</pre>
 
{{omit from|6502 Assembly}}
{{omit from|68000 Assembly}}
{{omit from|8080 Assembly}}
{{omit from|8086 Assembly}}
{{omit from|ARM Assembly}}
{{omit from|AWK}}
{{omit from|Axe}}
{{omit from|Batch File|Not an OO language.}}
{{omit from|C|not really an OO language,single inheritance emulation is complex enough}}
{{omit from|JavaScript|https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Property_Inheritance_Revisited/No_Multiple_Inheritance}}
{{omit from|Metafont}}
{{omit from|Mathematica}}
{{omit from|Maxima}}
{{omit from|MIPS Assembly|Not an OO language.}}
{{omit from|ML/I}}
{{omit from|PARI/GP}}
{{omit from|Retro}}
{{omit from|TI-83 BASIC|Does not have user-defined data structures or objects.}}
{{omit from|TI-89 BASIC|Does not have user-defined data structures or objects.}}
{{omit from|MIPSZ80 Assembly|Not an OO language.}}
{{omit from|Retro}}
9,482

edits