- Comparison of programming languages (object-oriented programming)
-
This Comparison of programming languages compares how object-oriented programming languages such as C++, Python, Perl, Java and others manipulate data structures.
Contents
Object construction and destruction
construction destruction ABAP Objects data variable type ref to class .
create object variable «exporting parameter = argument[1]».[2][3] C++ (STL) class variable«(parameters)»; or
class *variable = new class«(parameters)»;delete pointer; C# class variable = new class(parameters); variable.Dispose();[3] Java variable.dispose();[3] D delete variable; Objective-C (Cocoa) class *variable = [[class alloc ] init]; or
class *variable = [[class alloc ] initWithFoo:parameter «bar:parameter ...»];[variable release]; Python variable = class(parameters) del variable[3] (Normally not needed) Visual Basic .NET Dim variable As New class(parameters) variable.Dispose()[3] Eiffel create variable or
create «{TYPE}» variable.make_foo «(parameters)» or
variable := create {TYPE} or
variable := create {TYPE}.make_foo «(parameters)»[3] PHP $variable = new class(parameters); unset($variable); Perl 5 «my »$variable = class->new«(parameters)»; undef($variable); Perl 6 «my »$variable = class.new«(parameters)»; $variable.undefine; Ruby variable = class.new«(parameters)» [3] Windows PowerShell $variable = New-Object «-TypeName» class ««-ArgumentList» parameters» Remove-Variable «-Name» variable OCaml let variable = new class «parameters» or
let variable = object members end[4][3] F# let variable = «new »class(«parameters») Smalltalk "The class is an Object.
Just send a message to a class, usually #new or #new:, and many others, for example:"
Pointy x: 10 y: 20.
Array with: -1 with: 3 with: 2.JavaScript var variable = new class«(parameters)» or
var variable = { «key1: value1«, key2: value2 ...»»}[3] Class declaration
class protocol namespace ABAP Objects class name definition «inheriting from parentclass». «interfaces: interfaces.» method_and_field_declarations endclass.
class name implementation. method_implementations endclass.interface name. members endinterface. N/A C++ (STL) class name« : public parentclasses[5]» { members }; namespace name { members } C# class name« : «parentclass»«, interfaces»» { members } interface name« : parentinterfaces» { members } D module name;
membersJava class name« extends parentclass»« implements interfaces» { members } interface name« extends parentinterfaces» { members } package name; members PHP namespace name; members Objective-C @interface name« : parentclass[6]»«< protocols >» { instance_fields } method_and_property_declarations @end
@implementation name method_implementations @end[7]@protocol name«< parentprotocols >» members @end Prefixes to class and protocol names conventionally used as a kind of namespace Python class name«(parentclasses[5])»:
Tab ⇆ members[8] __all__ = [ member1,member2,... ] Visual Basic .NET Class name« Inherits parentclass»« Implements interfaces»
members
End ClassInterface name« Inherits parentinterfaces»
members
End InterfaceNamespace name
members
End NamespaceEiffel class name« inherit parentclasses[5]»
members
endN/A Perl package name; «@ISA = qw(parentclasses[5]);» members 1; package name; members Perl 6 class name «is parentclass «is parentclass ...[5]»» «does role «does role ...»» { members } role name «does role «does role ...»» { members } module name { members } Ruby class name« < parentclass»
members
endmodule name
members
endWindows PowerShell N/A OCaml class name «parameters» = object «(self)» «inherit parentclass «parameters» «inherit parentclass «parameters» ...[5]»» members end module name
membersF# type name«(parameters)» «as this» = class «inherit parentclass«(parameters)» «as base»» members «interface interface with implementation «interface interface with implementation ...»» end type name = interface members end namespace name
membersSmalltalk "The class is an Object.
Just send a message to the superclass (st-80) or the destination namespace (Visualworks)""The namespace is an Object.
Just send a message to the parent namespace"Class members
Constructors and destructors
constructor destructor finalizer[9] ABAP Objects methods constructor «importing parameter = argument»
method constructor. instructions endmethod.[10]N/A C++ (STL) class(«parameters») «: initializers[11]» { instructions } ~class() { instructions } C# class(«parameters») { instructions } void Dispose(){ instructions } ~class() { instructions } D this(«parameters») { instructions } ~this() { instructions } Java class(«parameters») { instructions } void dispose() { instructions } void finalize() { instructions } Eiffel [12] [13] Objective-C (Cocoa) - (id)init { instructions... return self; } or
- (id)initWithFoo:parameter «bar:parameter ...» { instructions... return self; }- (void)dealloc { instructions } - (void)finalize { instructions } Python def __init__(self«, parameters»):
Tab ⇆ instructionsdef __del__(self):
Tab ⇆ instructionsVisual Basic .NET Sub New(«parameters»)
instructions
End SubSub Dispose()
instructions
End SubOverrides Sub Finalize()
instructions
End SubPHP function __construct(«parameters») { instructions } function __destruct() { instructions } Perl sub new { my ($class«, parameters») = @_; my $self = {}; instructions ... bless($self, $class); return $self; } sub DESTROY { my ($self) = @_; instructions } Perl 6 submethod BUILD { instructions } or
«multi » method new(««$self: »parameters») { self.bless(*, field1 => value1, ...); ... instructions }submethod DESTROY { instructions } Ruby def initialize«(parameters)»
instructions
endN/A Windows PowerShell N/A OCaml initializer instructions[14] N/A F# do instructions or
new(parameters) = expression[15]member this.Dispose() = instructions override this.Finalize() = instructions Fields
public private protected friend ABAP Objects public section.[16] data field type type. private section.[16] data field type type. protected section.[16] data field type type. [17] C++ (STL) public: type field; private: type field; protected: type field; [18] C# public type field «= value»; private type field «= value»; protected type field «= value»; internal type field «= value»; D package type field «= value»; Java protected type field «= value»; type field «= value»; Eiffel feature
field: TYPEfeature {NONE}
field: TYPEfeature {current_class}
field: TYPEfeature {FRIEND}
field: TYPEObjective-C @public type field; @private type field; @protected type field; @package type field; Smalltalk N/A "Just send a message to the class"
class addInstVarName: field.
class removeInstVarName: field.N/A Python self.field = value
Just assign a value to it in a methodself.__field = value
Just assign a value to it in a methodN/A Visual Basic .NET Public field As type «= value» Private field As type «= value» Protected field As type «= value» Friend field As type «= value» PHP public $field «= value»; private $field «= value»; protected $field «= value»; Perl $self->{field} = value;
Just assign a value to it in a methodN/A Perl 6 has« type »$.field« is rw» has« type »$!field N/A Ruby N/A @field = value
Just assign a value to it in a methodWindows PowerShell Add-Member
«-MemberType »NoteProperty
«-Name »Bar «-Value »value
-InputObject variableN/A OCaml N/A val «mutable» field = value N/A F# N/A let «mutable» field = value N/A JavaScript this.field = value
Just assign a value to it in a methodMethods
basic/void method value-returning method ABAP Objects methods name «importing parameter = argument» «exporting parameter = argument» «changing parameter = argument» «returning value(parameter)»
method name. instructions endmethod.[19][20] C++ (STL)[21] void foo(«parameters») { instructions } type foo(«parameters») { instructions ... return value; } C# D Java Eiffel foo ( «parameters» )
do
instructions
endfoo ( «parameters» ): TYPE
do
instructions...
Result := value
endObjective-C - (void)foo«:parameter «bar:parameter ...»» { instructions } - (type)foo«:parameter «bar:parameter ...»» { instructions... return value; } Python def foo(self«, parameters»):
Tab ⇆ instructionsdef foo(self«, parameters»):
Tab ⇆ instructions
Tab ⇆ return valueVisual Basic .NET Sub Foo(«parameters»)
instructions
End SubFunction Foo(«parameters») As type
instructions
...
Return value
End FunctionPHP function foo(«parameters») { instructions } function foo(«parameters») { instructions ... return value; } Perl sub foo { my ($self«, parameters») = @_; instructions } sub foo { my ($self«, parameters») = @_; instructions ... return value; } Perl 6 «our »«multi »method foo(««$self: »parameters») { instructions } «our «type »»«multi »method foo(««$self: »parameters») { instructions ... return value; } Ruby def foo«(parameters)»
instructions
enddef foo«(parameters)»
instructions
expression resulting in return value
end
or
def foo«(parameters)»
instructions
return value
endWindows PowerShell Add-Member «-MemberType» ScriptMethod «-Name» foo «-Value» { «param(parameters)» instructions } -InputObject variable Add-Member «-MemberType» ScriptMethod «-Name» foo «-Value» { «param(parameters)» instructions ... return value } -InputObject variable OCaml N/A method foo «parameters» = expression F# member this.foo(«parameters») = expression JavaScript this.method = function(«parameters») {instructions}
Just assign a function to it in a methodthis.method = function(«parameters») {instructions... return value;}
Just assign a function to it in a methodProperties
How to declare a property named "Bar"
Manually implemented
read-write read-only write-only ABAP Objects N/A C++ (STL) N/A C# type Bar {
get { instructions ... return value; }
set { instructions } }type Bar { get { instructions ... return value; } } type Bar { set { instructions } } D @property type bar() { instructions ... return value; }
@property type bar(type value) { instructions ... return value; }@property type bar() { instructions ... return value; } @property type bar(type value) { instructions ... return value; } Java N/A Objective-C 2.0 (Cocoa) @property (readwrite) type bar;
and then inside @implementation
- (type)bar { instructions }
- (void)setBar:(type)value { instructions }@property (readonly) type bar;
and then inside @implementation
- (type)bar { instructions }
Eiffel feature -- Access
x: TYPE assign set_x
feature -- Settings
set_x (a_x: like x) do instructions ensure x_set: verification endPython def setBar(self, value):
Tab ⇆ instructions
def getBar(self):
Tab ⇆ instructions
Tab ⇆ return value
bar = property(getBar, setBar)def getBar(self):
Tab ⇆ instructions
Tab ⇆ return value
bar = property(getBar)def setBar(self, value):
Tab ⇆ instructions
bar = property(fset = setBar)Visual Basic .NET Property Bar() As type
Get
instructions
Return value
End Get
Set (ByVal Value As type)
instructions
End Set
End PropertyReadOnly Property Bar() As type
Get
instructions
Return value
End Get
End PropertyWriteOnly Property Bar() As type
Set (ByVal Value As type)
instructions
End Set
End PropertyPHP function __get($property) {
switch ($property) {
case 'Bar' : instructions ... return value;
} }
function __set($property, $value) {
switch ($property) {
case 'Bar' : instructions
} }function __get($property) {
switch ($property) {
case 'Bar' : instructions ... return value;
} }function __set($property, $value) {
switch ($property) {
case 'Bar' : instructions
} }Perl sub Bar {
my $self = shift;
if (my $Bar = shift) {
# setter
$self->{Bar} = $Bar;
return $self;
} else {
# getter
return $self->{Bar};
}
}sub Bar {
my $self = shift;
if (my $Bar = shift) {
# read-only
die "Bar is read-only\n";
} else {
# getter
return $self->{Bar};
}
}sub Bar {
my $self = shift;
if (my $Bar = shift) {
# setter
$self->{Bar} = $Bar;
return $self;
} else {
# write-only
die "Bar is write-only\n";
}
}Perl 6 N/A Ruby def bar
instructions
expression resulting in return value
end
def bar=(value)
instructions
enddef bar
instructions
expression resulting in return value
enddef bar=(value)
instructions
endWindows PowerShell Add-Member
«-MemberType »ScriptProperty
«-Name »Bar «-Value »{ instructions ... return value }
«-SecondValue »{ instructions }
-InputObject variableAdd-Member
«-MemberType »ScriptProperty
«-Name »Bar «-Value »{ instructions ... return value}
-InputObject variableAdd-Member
«-MemberType »ScriptProperty
«-Name »Bar -SecondValue { instructions }
-InputObject variableOCaml N/A F# member this.Bar with get() = expression and set(value) = expression member this.Bar = expression member this.Bar with set(value) = expression Automatically implemented
read-write read-only write-only ABAP Objects N/A C++ (STL) N/A C# type Bar { get; set; } type Bar { get; private set; } type Bar { private get; set; } D Java N/A Objective-C 2.0 (Cocoa) @property (readwrite) type bar;
and then inside @implementation
@synthesize bar;@property (readonly) type bar;
and then inside @implementation
@synthesize bar;Eiffel Python @property
def bar(self):
Tab ⇆instructions
@bar.setter
def bar(self, value):
Tab ⇆instructions@property
def bar(self):
Tab ⇆instructionsbar = property()
@bar.setter
def bar(self, value):
Tab ⇆instructionsVisual Basic .NET Property Bar As type« = initial_value» (VB 10) PHP Perl[22] use base qw(Class::Accessor);
__PACKAGE__->mk_accessors('Bar');use base qw(Class::Accessor);
__PACKAGE__->mk_ro_accessors('Bar');use base qw(Class::Accessor);
__PACKAGE__->mk_wo_accessors('Bar');Perl 6 N/A Ruby attr_accessor :bar attr_reader :bar attr_writer :bar Windows PowerShell OCaml N/A F# member val Bar = value with get, set Overloaded operators
Standard operators
unary binary function call ABAP Objects N/A C++ (STL) type operatorsymbol() { instructions } type operatorsymbol(type operand2) { instructions } type operator()(«parameters») { instructions } C# static type operator symbol(type operand) { instructions } static type operator symbol(type operand1, type operand2) { instructions } N/A D type opUnary(string s)() { switch (s) { case "symbol": instructions ... } } type opBinary(string s)(type operand2) { switch (s) { case "symbol": instructions ... } }
type opBinaryRight(string s)(type operand1) { switch (s) { case "symbol": instructions ... } }type opCall(«parameters») { instructions } Java N/A Objective-C Eiffel[23] op_name alias "symbol": TYPE
do instructions endop_name alias "symbol" (operand: TYPE1): TYPE2
do instructions endPython def __opname__(self):
Tab ⇆ instructions
Tab ⇆ return valuedef __opname__(self, operand2):
Tab ⇆ instructions
Tab ⇆ return valuedef __call__(self«, paramters»):
Tab ⇆ instructions
Tab ⇆ return valueVisual Basic .NET Shared Operator symbol(operand As type) As type
instructions
End OperatorShared Operator symbol(operand1 As type, operand2 As type) As type
instructions
End OperatorN/A PHP [24] function __invoke(«parameters») { instructions } (PHP 5.3+) Perl use overload "symbol" => sub { my ($self) = @_; instructions }; use overload "symbol" => sub { my ($self, $operand2, $operands_reversed) = @_; instructions }; Perl 6 «our «type »»«multi »method prefix:<symbol> («$operand: ») { instructions ... return value; } or
«our «type »»«multi »method postfix:<symbol> («$operand: ») { instructions ... return value; } or
«our «type »»«multi »method circumfix:<symbol1 symbol2> («$operand: ») { instructions ... return value; }«our «type »»«multi »method infix:<symbol> («$operand1: » type operand2) { instructions ... return value; } «our «type »»«multi »method postcircumfix:<( )> («$self: » «parameters») { instructions } Ruby def symbol
instructions
expression resulting in return value
enddef symbol(operand2)
instructions
expression resulting in return value
endN/A Windows PowerShell N/A OCaml F# static member (symbol) operand = expression static member (symbol) (operand1, operand2) = expression N/A Indexers
read-write read-only write-only ABAP Objects N/A C++ (STL) type& operator[](type index) { instructions } type operator[](type index) { instructions } C# type this[type index] {
get{ instructions }
set{ instructions } }type this[type index] { get{ instructions } } type this[type index] { set{ instructions } } D type opIndex(type index) { instructions }
type opIndexAssign(type value, type index) { instructions }type opIndex(type index) { instructions } type opIndexAssign(type value, type index) { instructions } Java N/A Objective-C Eiffel[23] bracket_name alias "[]" (index: TYPE): TYPE assign set_item
do instructions end
set_item (value: TYPE; index: TYPE):
do instructions endbracket_name alias "[]" (index: TYPE): TYPE
do instructions endPython def __getitem__(self, index):
Tab ⇆ instructions
Tab ⇆ return value
def __setitem__(self, index, value):
Tab ⇆ instructionsdef __getitem__(self, index):
Tab ⇆ instructions
Tab ⇆ return valuedef __setitem__(self, index, value):
Tab ⇆ instructionsVisual Basic .NET Default Property Item(Index As type) As type
Get
instructions
End Get
Set(ByVal Value As type)
instructions
End Set
End PropertyDefault ReadOnly Property Item(Index As type) As type
Get
instructions
End Get
End PropertyDefault WriteOnly Property Item(Index As type) As type
Set(ByVal Value As type)
instructions
End Set
End PropertyPHP [25] Perl [26] Perl 6 «our «type »»«multi »method postcircumfix:<[ ]> is rw («$self: » type $index) { instructions ... return value; } or
«our «type »»«multi »method postcircumfix:<{ }> is rw («$self: » type $key) { instructions ... return value; }«our «type »»«multi »method postcircumfix:<[ ]>(«$self: » type $index) { instructions ... return value; } or
«our «type »»«multi »method postcircumfix:<{ }> («$self: » type $key) { instructions ... return value; }N/A Ruby def [](index)
instructions
expression resulting in return value
end
def []=(index, value)
instructions
enddef [](index)
instructions
expression resulting in return value
enddef []=(index, value)
instructions
endWindows PowerShell N/A OCaml F# member this.Item with get(index) = expression and set index value = expression member this.Item with get(index) = expression member this.Item with set index value = expression Type casts
downcast upcast ABAP Objects N/A C++ (STL) operator returntype() { instructions } C# static explicit operator returntype(type operand) { instructions } static implicit operator returntype(type operand) { instructions } D T opCast(T)() { if (is(T == type)) { instructions } ... } Java N/A Objective-C Eiffel[23] Python Visual Basic .NET Shared Narrowing Operator CType(operand As type) As returntype
instructions
End OperatorShared Widening Operator CType(operand As type) As returntype
instructions
End OperatorPerl 6 multi method type«($self:)» is export { instructions } PHP N/A Perl Ruby Windows PowerShell OCaml F# Member access
How to access members of an object x
object member class member namespace member method field property ABAP Objects x->method(«parameters[27]»). x->field N/A x=>field or x=>method(«parameters[27]»). N/A C++ (STL) x.method(parameters) or
ptr->method(parameters)x.field or
ptr->fieldcls::member ns::member Objective-C [x method«:parameter «bar:parameter ...»»] x->field x.property (2.0 only) or
[x property][cls method«:parameter «bar:parameter ...»»] Smalltalk x method«:parameter «bar:parameter ...»» N/A cls method«:parameter «bar:parameter ...»» C# x.method(parameters) x.field x.property cls.member ns.member Java N/A D x.property Python Visual Basic .NET Windows PowerShell [cls]::member F# N/A cls.member Eiffel x.method«(parameters)» x.field {cls}.member N/A Ruby N/A x.property cls.member PHP x->method(parameters) x->field x->property cls::member ns\member Perl x->method«(parameters)» x->{field} cls->method«(parameters)» ns::member Perl 6 x.method«(parameters)» or
x!method«(parameters)»x.field or
x!fieldcls.method«(parameters)» or
cls!method«(parameters)»ns::member OCaml x#method «parameters» N/A JavaScript x.method(parameters) x.field Member availability
Has member? Handler for missing member Method Field Method Field ABAP Objects N/A C++ (STL) Objective-C (Cocoa) [x respondsToSelector:@selector(method)] N/A forwardInvocation: N/A Smalltalk x respondsTo: selector N/A doesNotUnderstand: N/A C# (using reflection) Java D opDispatch() Eiffel N/A Python hasattr(x, "method") and callable(x.method) hasattr(x, "field") __getattr__() Visual Basic .NET (using reflection) Windows PowerShell (using reflection) F# (using reflection) Eiffel N/A Ruby x.respond_to?(:method) N/A method_missing() N/A PHP method_exists(x, "method") property_exists(x, "field") __call() __get() / __set() Perl x->can("method") exists x->{field} AUTOLOAD Perl 6 x.can("method") x.field.defined AUTOLOAD OCaml N/A JavaScript typeof(x.method) == 'function' field in x Special variables
current object current object's parent object null reference Current Context of Execution Smalltalk self super nil thisContext ABAP Objects me super initial C++ (STL) *this [28] NULL C# this base[29] null Java super[29] D JavaScript Objective-C self super nil Python self[30] super(current_class_name, self)[5]
super() (3.x only)None Visual Basic .NET Me MyBase Nothing Eiffel Current Precursor «{superclass}» «(args)»[29][31] Void PHP $this parent[29] NULL Perl $self[30] $self->SUPER[29] undef Perl 6 self SUPER Nil Ruby self super«(args)»[32] nil binding Windows PowerShell $this $NULL OCaml self[33] super[34] N/A[35] F# this base[29] null Special methods
String representation Object copy Value equality Object comparison Hash code Object ID Human-readable Source-compatible ABAP Objects N/A C++ (STL) x == y[36] pointer to object can be converted into an integer ID C# x.ToString() x.Clone() x.Equals(y) x.CompareTo(y) x.GetHashCode() System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(x) Java x.toString() x.clone()[37] x.equals(y) x.compareTo(y) x.hashCode() System.identityHashCode(x) JavaScript x.toString() D x.toString() or
std.conv.to!string(x)x.stringof x == y x.toHash() Objective-C (Cocoa) [x description] [x debugDescription] [x copy][38] [x isEqual:y] [x compare:y][39] [x hash] pointer to object can be converted into an integer ID Smalltalk x displayString x printString x copy x = y x hash x identityHash Python str(x)[40] repr(x)[41] copy.copy(x)[42] x == y[43] cmp(x ,y)[44] hash(x)[45] id(x) Visual Basic .NET x.ToString() x.Clone() x.Equals(y) x.CompareTo(y) x.GetHashCode() Eiffel x.out x.twin x.is_equal(y) When x is COMPARABLE, one can simply do x < y When x is HASHABLE, one can simply do x.hash_code When x is IDENTIFIED, one can simply do x.object_id PHP sprintf("%s", x)[46] clone x[47] x == y spl_object_hash(x) Perl "$x"[48] Data::Dumper->Dump([$x],['x'])[49] Storable::dclone($x)[50] Scalar::Util::refaddr( $x )[51] Perl 6 ~x[48] x.perl x.clone x eqv y x cmp y Ruby x.to_s x.inspect x.dup or
x.clonex == y or
x.eql?(y)x <=> y x.hash x.object_id Windows PowerShell x.ToString() x.Clone() x.Equals(y) x.CompareTo(y) x.GetHashCode() OCaml Oo.copy x x = y Hashtbl.hash x Oo.id x F# string x or x.ToString() or sprintf "%O" x sprintf "%A" x x.Clone() x = y or x.Equals(y) compare x y or x.CompareTo(y) hash x or x.GetHashCode() Type manipulation
Get object type Is instance of (includes subtypes) Upcasting Downcasting Runtime check No check ABAP Objects N/A = ?= C++ (STL) typeid(x) dynamic_cast<type *>(&x) != NULL N/A[52] dynamic_cast<type*>(ptr) (type*) ptr or
static_cast<type*>(ptr)C# x.GetType() x is type (type) x or x as type D typeid(x) cast(type) x Java x.getClass() x instanceof class (type) x Objective-C (Cocoa) [x class] [x isKindOfClass:[class class]] (type*) x JavaScript x.constructor x instanceof class N/A[53] Visual Basic .NET x.GetType() TypeOf x Is type N/A[52] CType(x, type) or TryCast(x, type) Eiffel x.generating_type attached {TYPE} x attached {TYPE} x as down_x Python type(x) isinstance(x, type) N/A[53] PHP get_class(x) x instanceof class Perl ref(x) x->isa("class") Perl 6 x.WHAT x.isa(class) N/A[52] type(x) or
x.typeRuby x.class or
x.typex.instance_of?(type) or
x.kind_of?(type)N/A[53] Smalltalk x class x isKindOf: class Windows PowerShell x.GetType() x -is [type] N/A[52] [type]x or x -as [type] OCaml N/A[54] (x :> type) N/A F# x.GetType() x :? type (x :?> type) Namespace management
Import namespace Import item qualified unqualified ABAP Objects C++ (STL) using namespace ns; using ns::item ; C# using ns; D import ns; import ns : item; Java import ns.*; import ns.item Objective-C Visual Basic .NET Imports ns Eiffel Python import ns from ns import * from ns import item PHP use ns; use ns/item; Perl use ns; Perl 6 Ruby Windows PowerShell OCaml open ns F# Contracts
Precondition Postcondition Check Invariant Loop ABAP Objects N/A C++ (STL) C# Spec#:
type foo( «parameters» )
requires expression
{
body
}Spec#:
type foo( «parameters» )
ensures expression
{
body
}Java N/A Objective-C Visual Basic .NET D f in { expression } body{ instructions } f out (result) { expression } body{ instructions } invariant() { expression } Eiffel f
require tag: expression
do endf
do
ensure tag: expression
endf
do
check tag: expression end
endclass X
invariant tag: expression
endfrom instructions
invariant
tag: expression
until
expr
loop
instructions
variant
tag: expression
endPython N/A PHP Perl Perl 6 PRE { condition } POST { condition } Ruby N/A Windows PowerShell OCaml F# See also
References and notes
- ^ parameter = argument may be repeated if the constructor has several parameters
- ^ SAP reserved to himself the use of destruction
- ^ a b c d e f g h i This language uses garbage collection to release unused memory.
- ^ OCaml objects can be created directly without going through a class.
- ^ a b c d e f g This language supports multiple inheritance. A class can have more than one parent class
- ^ Not providing a parent class makes the class a root class. In practice, this is almost never done. One should generally use the conventional base class of the framework one is using, which is
NSObject
for Cocoa and GNUstep, orObject
otherwise. - ^ Usually the
@interface
portion is placed into a header file, and the@interface
portion is placed into a separate source code file. - ^ In Python interfaces are classes whose methods have pass as their bodies
- ^ A finalizer is called by the garbage collector when an object is about to be garbage-collected. There is no guarantee on when it will be called or if it will be called at all.
- ^ In ABAP, the constructor is to be defined like a method (see comments about method) with the following restrictions: the method name must be "constructor", and only "importing" parameters can be defined
- ^ An optional comma-separated list of initializers for member objects and parent classes goes here. The syntax for initializing member objects is "member_name(parameters)" This works even for primitive members, in which case one parameter is specified and that value is copied into the member. The syntax for initializing parent classes is "class_name(parameters)". If an initializer is not specified for a member or parent class, then the default constructor is used.
- ^ Any Eiffel procedure can be used as a creation procedure, aka constructors. See Eiffel paragraph at Constructor (computer science).
- ^ Implementing {DISPOSABLE}.dispose ensures that dispose will be called when object is garbage collected.
- ^ This "initializer" construct is rarely used. Fields in OCaml are usually initialized directly in their declaration. Only when additional imperative operations are needed is "initializer" used. The "parameters to the constructor" in other languages are instead specified as the parameters to the class in OCaml. See the class declaration syntax for more details.
- ^ This syntax is usually used to overload constructors
- ^ a b c Scope identifier must appear once in the file declaration, all variable declarations after this scope identifier have his scope, until another scope identifier or the end of class declaration is reached
- ^ In ABAP, you don't declare specific fields or methods to be accessible by outside things. Rather, you declare outside classes to be friends to have access to the class's fields or methods.
- ^ In C++, you don't declare specific fields to be accessible by outside things. Rather, you declare outside functions and classes to be friends to have access to the class's fields. See friend function and friend class for more details.
- ^ The declaration and implementation of methods in ABAP are separate. methods statement is to be used inside the class definition. method (without "s") is to be used inside the class implementation. parameter = argument can be repeated if there are several parameters.
- ^ In ABAP, the return parameter name is explicitly defined in the method signature within the class definition
- ^ The declaration and implementation of methods in C++ are usually separate. Methods are declared inside the class definition (which is usually included in a header file) using the syntax
- type foo(«parameters»);
- type class::foo(«parameters») { instructions }
- ^ these examples need the Class::Accessor module installed
- ^ a b c Although Eiffel does not support overloading of operators, it can define operators
- ^ PHP does not support operator overloading natively, but support can be added using the "operator" PECL package.
- ^ Your class needs to implement the ArrayAccess interface.
- ^ Your class needs to overload '@{}' (array dereference) or subclass one of Tie::Array or Tie::StdArray to hook array operations
- ^ a b In ABAP, arguments must be passed using this syntax:
- x->method(«exporting parameter = argument» «importing parameter = argument» «changing parameter = argument» «returning value(parameter)»
- parameter = argument can be repeated if there are several parameters
- ^ C++ doesn't have a "super" keyword, because multiple inheritance is possible, and so it may be ambiguous which base class is desired. Instead, you can use the
BaseClassName::member
syntax to access an overridden member in the specified base class. Microsoft Visual C++ provides a non-standard keyword "__super" for this purpose; but this is not supported in other compilers.[1] - ^ a b c d e f The keyword here is not a value in itself and it can only be used to access a method of the superclass.
- ^ a b In this language, instance methods are passed the current object as the first parameter, which is conventionally named "self", but this is not required to be the case.
- ^ "Precursor" in Eiffel is actually a call to the method of the same name in the superclass. So Precursor(args) is equivalent to "super.currentMethodName(args)" in Java. There is no way of calling a method of different name in the superclass.
- ^ "super" in Ruby, unlike in other languages, is actually a call to the method of the same name in the superclass. So super(args) in Ruby is equivalent to "super.currentMethodName(args)" in Java. There is no way of calling a method of different name in the superclass.
- ^ In OCaml, an object declaration can optionally start with a parameter which will be associated with the current object. This parameter is conventionally named "self", but this is not required to be the case. It is good practice to put a parameter there so that one can call one's own methods.
- ^ In OCaml, an inheritance declaration ("inherit") can optionally be associated with a value, with the syntax "inherit parent_class «parameters» as super". Here "super" is the name we gave to the variable associated with this parent object. It can be named something else.
- ^ However, if you really wanted the ability to have an "optional" value in OCaml, you would wrap the value inside an
option
type, whose values areNone
andSome x
, which could be used to represent "null reference" and "non-null reference to an object" as in other languages. - ^ assuming that "x" and "y" are the objects (and not a pointer). Can be customized by overloading the object's
==
operator - ^ Only accessible from within the class itself, since the
clone()
method inherited fromObject
is protected, unless the class overrides the method and makes it public. If you use theclone()
inherited fromObject
, your class will need to implement theCloneable
interface to allow cloning. - ^ Implemented by the object's
copyWithZone:
method - ^
compare:
is the conventional name for the comparison method in Foundation classes. However, no formal protocol exists - ^ Can be customized by the object's
__str__()
method - ^ Can be customized by the object's
__repr__()
method - ^ Can be customized by the object's
__copy__()
method - ^ Can be customized by the object's
__eq__()
method - ^ Only in Python 2.x and before (removed in Python 3.0). Can be customized by the object's
__cmp__()
method - ^ Can be customized by the object's
__hash__()
method. Not all types are hashable (mutable types are usually not hashable) - ^ Can be customized by the object's
__toString()
method - ^ Can be customized by the object's
__clone()
method - ^ a b Can be customized by overloading the object's string conversion operator
- ^ This example requires useing Data::Dumper
- ^ This example requires useing Storable
- ^ This example requires useing Scalar::Util
- ^ a b c d Upcasting is implicit in this language. A subtype instance can be used where a supertype is needed.
- ^ a b c This language is dynamically typed. Casting between types is not necessary.
- ^ This language doesn't give run-time type information. It is unnecessary because it is statically typed and downcasting is not possible.
Categories:- Programming language comparisons
- Object-oriented programming
Wikimedia Foundation. 2010.