Jump to content

Comparison of programming languages (object-oriented programming): Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Special variables: you can overwrite the upper case NULL in php as a constant, you can't with the lower case version
added swift
Line 33: Line 33:
| <tt>class '''[[Pointer (computer programming)|*]]'''variable '''= [['''class''' alloc ] init];''' or <br /> class '''[[Pointer (computer programming)|*]]'''variable '''= [['''class''' alloc ] '''initWithFoo''':'''parameter «bar''':'''parameter ...»'''];'''</tt>
| <tt>class '''[[Pointer (computer programming)|*]]'''variable '''= [['''class''' alloc ] init];''' or <br /> class '''[[Pointer (computer programming)|*]]'''variable '''= [['''class''' alloc ] '''initWithFoo''':'''parameter «bar''':'''parameter ...»'''];'''</tt>
| <tt>'''['''variable '''release];'''</tt>
| <tt>'''['''variable '''release];'''</tt>
|-
| [[Swift (programming language)|Swift]]
| <tt>'''let''' variable '''=''' class'''('''parameters''')'''</tt>
|
|-
|-
| [[Python (programming language)|Python]]
| [[Python (programming language)|Python]]
Line 145: Line 149:
| <tt>'''@protocol '''name«'''<''' parentprotocols '''>'''» members''' @end'''</tt>
| <tt>'''@protocol '''name«'''<''' parentprotocols '''>'''» members''' @end'''</tt>
| {{n/a|<ref>Prefixes to class and protocol names conventionally used as a kind of namespace</ref>}}
| {{n/a|<ref>Prefixes to class and protocol names conventionally used as a kind of namespace</ref>}}
|-
| Swift
| <tt>'''class '''name«''' : '''«parentclass»«''',''' protocols»»''' { '''members''' }'''</tt>
| <tt>'''protocol '''name«''' : '''parentprotocols»''' { '''members''' }'''</tt>
|
|-
|-
| Python
| Python
Line 293: Line 302:
| <tt>'''- (void)dealloc { '''instructions''' }'''</tt>
| <tt>'''- (void)dealloc { '''instructions''' }'''</tt>
| <tt>'''- (void)finalize { '''instructions''' }'''</tt>
| <tt>'''- (void)finalize { '''instructions''' }'''</tt>
|-
| Swift
| <tt>'''init('''«parameters»''') { '''instructions''' }'''</tt>
| <tt>'''deinit { '''instructions''' }'''</tt>
|
|-
|-
| Python
| Python
Line 395: Line 409:
| <tt>'''@protected '''type field''';'''</tt>
| <tt>'''@protected '''type field''';'''</tt>
| <tt>'''@package '''type field''';'''</tt>
| <tt>'''@package '''type field''';'''</tt>
|-
| Swift
| colspan=4 {{n/a}}
|-
|-
| Smalltalk
| Smalltalk
Line 502: Line 519:
| <tt>'''- (void)'''foo«''':'''parameter «bar''':'''parameter ...»»''' { '''instructions''' }'''</tt>
| <tt>'''- (void)'''foo«''':'''parameter «bar''':'''parameter ...»»''' { '''instructions''' }'''</tt>
| <tt>'''- ('''type''')'''foo«''':'''parameter «bar''':'''parameter ...»»''' { '''instructions... '''return''' value'''; }'''</tt>
| <tt>'''- ('''type''')'''foo«''':'''parameter «bar''':'''parameter ...»»''' { '''instructions... '''return''' value'''; }'''</tt>
|- valign="top"
| Swift
| <tt>'''func '''foo'''('''«parameters»''') { '''instructions''' }'''</tt>
| <tt>'''func '''foo'''('''«parameters»''') -> '''type''' { '''instructions... '''return''' value''' }'''</tt>
|- valign="top"
|- valign="top"
| Python
| Python
Line 598: Line 619:
| <tt>'''@property (readonly)''' type bar''';''' <br /></tt> and then inside <br/><tt>@implementation <br />
| <tt>'''@property (readonly)''' type bar''';''' <br /></tt> and then inside <br/><tt>@implementation <br />
'''- ('''type''')'''bar''' { '''instructions''' }'''</tt>
'''- ('''type''')'''bar''' { '''instructions''' }'''</tt>
|
| {{n/a}}
|- valign="top"
| Swift
| <tt>'''var''' bar ''':''' type '''{ get { '''instructions''' } set'''«'''('''newBar''')'''»''' { '''instructions''' } }'''</tt>
| <tt>'''var''' bar ''':''' type '''{ '''instructions''' }'''</tt>
| {{n/a}}
|- valign="top"
|- valign="top"
| Eiffel
| Eiffel
Line 723: Line 749:
| <tt>'''@property (readwrite)''' type bar''';''' <br /> and then inside @implementation <br /> '''@synthesize''' bar''';'''</tt>
| <tt>'''@property (readwrite)''' type bar''';''' <br /> and then inside @implementation <br /> '''@synthesize''' bar''';'''</tt>
| <tt>'''@property (readonly)''' type bar''';''' <br /> and then inside @implementation <br /> '''@synthesize''' bar''';'''</tt>
| <tt>'''@property (readonly)''' type bar''';''' <br /> and then inside @implementation <br /> '''@synthesize''' bar''';'''</tt>
|
| {{n/a}}
|- valign="top"
| Swift
| <tt>'''var''' bar ''':''' type</tt>
| <tt>'''let''' bar ''':''' type</tt>
| {{n/a}}
|- valign="top"
|- valign="top"
| Eiffel
| Eiffel
Line 808: Line 839:
|-
|-
| Objective-C
| Objective-C
|-
| Swift
| <tt>'''func''' symbol'''('''operand1 ''':''' type''') -> '''returntype''' { '''instructions''' }'''</tt> (outside class)
| <tt>'''func''' symbol'''('''operand1 ''':''' type1''', '''operand2 ''':''' type2''') -> '''returntype''' { '''instructions''' }'''</tt> (outside class)
|
|-
|-
| Eiffel<ref name="Eiffel operators">Although Eiffel does not support overloading of operators, it can define operators</ref>
| Eiffel<ref name="Eiffel operators">Although Eiffel does not support overloading of operators, it can define operators</ref>
Line 894: Line 930:
| <tt>'''- (id)objectAtIndexedSubscript:(NSUInteger)'''index''' { '''instructions''' return '''value'''; }''' or<br />'''- (id)objectForKeyedSubscript:(id)'''index''' { '''instructions''' return '''value'''; }'''</tt>
| <tt>'''- (id)objectAtIndexedSubscript:(NSUInteger)'''index''' { '''instructions''' return '''value'''; }''' or<br />'''- (id)objectForKeyedSubscript:(id)'''index''' { '''instructions''' return '''value'''; }'''</tt>
| <tt>'''- (void)setObject:(id)'''value''' atIndexedSubscript:(NSUInteger)'''index''' { '''instructions''' }''' or<br />'''- (void)setObject:(id)'''value''' forKeyedSubscript:(id)'''index''' { '''instructions''' }'''</tt>
| <tt>'''- (void)setObject:(id)'''value''' atIndexedSubscript:(NSUInteger)'''index''' { '''instructions''' }''' or<br />'''- (void)setObject:(id)'''value''' forKeyedSubscript:(id)'''index''' { '''instructions''' }'''</tt>
|- valign="top"
| Swift
| <tt>'''subscript ('''index''' : '''type''') -> '''returntype''' { get { '''instructions''' } set'''«'''('''newIndex''')'''»''' { '''instructions''' } }'''</tt>
| <tt>'''subscript ('''index''' : '''type''') -> '''returntype''' { '''instructions''' }'''</tt>
|
|- valign="top"
|- valign="top"
| Eiffel<ref name="Eiffel operators"/>
| Eiffel<ref name="Eiffel operators"/>
Line 1,041: Line 1,082:
|
|
| <tt>cls method«''':'''parameter «bar''':'''parameter ...»»</tt>
| <tt>cls method«''':'''parameter «bar''':'''parameter ...»»</tt>
|
|-
| Swift
| <tt>'''x.'''method'''('''parameters''')'''</tt>
|
| <tt>'''x.'''property</tt>
| <tt>cls'''.'''member</tt>
|
|
|-
|-
Line 1,258: Line 1,306:
|-
|-
| Java
| Java
| rowspan=2| <tt>'''super'''<ref name="limited_super" /></tt>
| rowspan=2| <tt>'''super'''</tt><ref name="limited_super" />
|
|
|-
|-
Line 1,271: Line 1,319:
| Objective-C
| Objective-C
| <tt>'''self'''</tt>
| <tt>'''self'''</tt>
| <tt>'''super'''</tt>
| <tt>'''super'''</tt><ref name="limited_super" />
| <tt>'''nil'''</tt>
| <tt>'''nil'''</tt>
|
|-
| Swift
| <tt>'''self'''</tt>
| <tt>'''super'''</tt><ref name="limited_super" />
| <tt>'''nil'''</tt><ref>only for Optional types</ref>
|
|
|-
|-
Line 1,576: Line 1,630:
|
|
| <tt>'''('''type'''*)''' x</tt>
| <tt>'''('''type'''*)''' x</tt>
|-
| Swift
| <tt>x'''.dynamicType'''</tt>
| <tt>x '''is''' type</tt>
|
| <tt>x '''as''' type</tt>
|-
|-
| JavaScript
| JavaScript

Revision as of 09:25, 6 June 2014

This Comparison of programming languages compares how object-oriented programming languages such as C++, Python, Perl, Java, Object Pascal and others manipulate data structures.

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 [3]
D delete variable;
Objective-C (Cocoa) class *variable = [[class alloc ] init]; or
class *variable = [[class alloc ] initWithFoo:parameter «bar:parameter ...»];
[variable release];
Swift let variable = class(parameters)
Python variable = class(parameters) del variable[3] (Normally not needed)
Visual Basic .NET Dim variable As New class(parameters) variable.Dispose()[3]
Xojo Dim variable As New class(parameters) variable = Nil
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]
Object Pascal / Delphi ClassVar := ClassType.ConstructorName(parameters); ClassVar.Free;
Scala
val obj = new Object // no parameters
val obj = new Object(arg0, arg1, arg2...)
val obj = Object(arg0, arg1, arg2...) // case class
val obj = new Object(arg0, arg1, param1 = value1, ...) // named parameters
[3]
COBOL INVOKE class "NEW" RETURNING variable or
MOVE class::"NEW" TO variable

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.
C++ (STL) class name« : public parentclasses[5]» { members }; namespace name { members }
C# class name« : «parentclass»«, interfaces»» { members } interface name« : parentinterfaces» { members }
D module name;
members
Java 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 [8]
Swift class name« : «parentclass»«, protocols»» { members } protocol name« : parentprotocols» { members }
Python class name«(parentclasses[5])»:
Tab ↹
members
[9] __all__ = [ member1,member2,... ]
Visual Basic .NET Class name« Inherits parentclass»« Implements interfaces»
members
End Class
Interface name« Inherits parentinterfaces»
members
End Interface
Namespace name
members
End Namespace
Xojo Class name« Inherits parentclass»« Implements interfaces»
members
End Class
Interface name« Inherits parentinterfaces»
members
End Interface
Module name
members
End Module
Eiffel class name« inherit parentclasses[5]»
members
end
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
end
module name
members
end
Windows PowerShell
OCaml class name «parameters» = object «(self)» «inherit parentclass «parameters» «inherit parentclass «parameters» ...[5]»» members end module name
members
F# 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
members
Smalltalk [10] [11]
Object Pascal (Delphi)

'ClassName = Class' «(ClassParent, Interfaces)»
private
// Private members(include Methods and Fields)
public
// Public members
protected
// Protected members
published
// Published members
end;

package name; members
Scala
class ConcreteClass(constructor params)
extends ParentClass
with Trait1 with Trait2 with Trait2 {
// members
}
trait TraitName
extends OtherTrait1
with OtherTrait2 with OtherTrait3 {
// members
}
package name
COBOL CLASS-ID. name« INHERITS« FROM» parentclasses».
    FACTORY« IMPLEMENTS interfaces».
      class-members
    END FACTORY.
    OBJECT« IMPLEMENTS interfaces».
      instance-members
    END OBJECT.

END CLASS name.

INTERFACE-ID. name« INHERITS« FROM» interfaces».
    members

END INTERFACE name.

Class members

Constructors and destructors

constructor destructor finalizer[12]
ABAP Objects methods constructor «importing parameter = argument»
method constructor. instructions endmethod.
[13]
C++ (STL) class(«parameters») «: initializers[14]» { instructions } ~class() { instructions }
C# class(«parameters») { instructions } void Dispose(){ instructions } ~class() { instructions }
D this(«parameters») { instructions } ~this() { instructions }
Java class(«parameters») { instructions } void finalize() { instructions }
Eiffel [15] [16]
Objective-C (Cocoa) - (id)init { instructions... return self; } or
- (id)initWithFoo:parameter «bar:parameter ...» { instructions... return self; }
- (void)dealloc { instructions } - (void)finalize { instructions }
Swift init(«parameters») { instructions } deinit { instructions }
Python def __init__(self«, parameters»):
Tab ↹ instructions
def __del__(self):
Tab ↹ instructions
Visual Basic .NET Sub New(«parameters»)
instructions
End Sub
Sub Dispose()
instructions
End Sub
Overrides Sub Finalize()
instructions
End Sub
Xojo Sub Constructor(«parameters»)
instructions
End Sub
Sub Destructor()
instructions
End Sub
PHP 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
end
Windows PowerShell
OCaml initializer instructions[17]
F# do instructions or
new(parameters) = expression
[18]
member this.Dispose() = instructions override this.Finalize() = instructions
JavaScript function name«(«parameters») { instructions }[19]
COBOL [20]

Fields

public private protected friend
ABAP Objects public section.[21] data field type type. private section.[21] data field type type. protected section.[21] data field type type. [22]
C++ (STL) public: type field; private: type field; protected: type field; [23]
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: TYPE
feature {NONE}
field: TYPE
feature {current_class}
field: TYPE
feature {FRIEND}
field: TYPE
Objective-C @public type field; @private type field; @protected type field; @package type field;
Swift
Smalltalk [24]
Python self.field = value[25] [26]
Visual Basic .NET Public field As type «= value» Private field As type «= value» Protected field As type «= value» Friend field As type «= value»
Xojo Public field As type «= value» Private field As type «= value» Protected field As type «= value»
PHP public $field «= value»; private $field «= value»; protected $field «= value»;
Perl $self->{field} = value;[25]
Perl 6 has« type »$.field« is rw» has« type »$!field
Ruby @field = value[25]
Windows PowerShell Add-Member
«-MemberType »NoteProperty
«-Name »Bar «-Value »value
-InputObject variable
OCaml val «mutable» field = value
F# let «mutable» field = value
JavaScript this.field = value
this["field"] = value
[25]
COBOL level-number field clauses.[27]

Methods

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.[28]
[29]
C++[30] void foo(«parameters») { instructions } type foo(«parameters») { instructions ... return value; }
C#
D
Java
Eiffel foo ( «parameters» )
do
instructions
end
foo ( «parameters» ): TYPE
do
instructions...
Result := value
end
Objective-C - (void)foo«:parameter «bar:parameter ...»» { instructions } - (type)foo«:parameter «bar:parameter ...»» { instructions... return value; }
Swift func foo(«parameters») { instructions } func foo(«parameters») -> type { instructions... return value }
Python def foo(self«, parameters»):
Tab ↹
instructions
def foo(self«, parameters»):
Tab ↹
instructions
Tab ↹ return
value
Visual Basic .NET Sub Foo(«parameters»)
instructions
End Sub
Function Foo(«parameters») As type
instructions
...
Return value
End Function
Xojo Sub Foo(«parameters»)
instructions
End Sub
Function Foo(«parameters») As type
instructions
...
Return value
End Function
PHP 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 «has »«multi »method foo(««$self: »parameters») { instructions } «has «type »»«multi »method foo(««$self: »parameters») { instructions ... return value; }
Ruby def foo«(parameters)»
instructions
end
def foo«(parameters)»
instructions
expression resulting in return value
end
or
def foo«(parameters
instructions
return value
end
Windows 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 method foo «parameters» = expression
F# member this.foo(«parameters») = expression
JavaScript this.method = function(«parameters») {instructions}
name«.prototype.method = function(«parameters») {instructions}
[31]
this.method = function(«parameters») {instructions... return value;}
name«.prototype.method = function(«parameters») {instructions... return value;}
[31]
COBOL METHOD-ID. foo.

«DATA DIVISION.
LINKAGE SECTION.
parameter declarations»
PROCEDURE DIVISION« USING parameters».

    instructions

END METHOD foo.

METHOD-ID. foo.

DATA DIVISION.
LINKAGE SECTION.
«parameter declarations»
result-var declaration
PROCEDURE DIVISION« USING parameters» RETURNING result-var.

    instructions

END METHOD foo.

Properties

How to declare a property named "Bar"

Manually implemented

read-write read-only write-only
ABAP Objects
C++ (STL)
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
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 }

Swift var bar : type { get { instructions } set«(newBar)» { instructions } } var bar : type { instructions }
Eiffel feature -- Access
x: TYPE assign set_x
feature -- Settings
set_x (a_x: like x) do instructions ensure x_set: verification end
Python def setBar(self, value):
Tab ↹ instructions
def
getBar(self):
Tab ↹
instructions
Tab ↹ return value
bar = property(getBar, setBar)
[32]
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 Property
ReadOnly Property Bar() As type
Get
instructions
Return value
End Get
End Property
WriteOnly Property Bar() As type
Set (ByVal Value As type)
instructions
End Set
End Property
Xojo ComputedProperty Bar() As type
Get
instructions
Return value
End Get
Set (ByVal
Value As type)
instructions
End Set
End ComputedProperty
ComputedProperty Bar() As type
Get
instructions
Return value
End Get
End ComputedProperty
ComputedProperty Bar() As type
Set (value As type)
instructions
End Set
End ComputedProperty
PHP 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
Ruby def bar
instructions
expression resulting in return value
end
def bar=(value)
instructions
end
def bar
instructions
expression resulting in return value
end
def bar=(value)
instructions
end
Windows PowerShell Add-Member
«-MemberType »ScriptProperty
«-Name »Bar «-Value »{ instructions ... return value }
«-SecondValue »{ instructions }
-InputObject variable
Add-Member
«-MemberType »ScriptProperty
«-Name »Bar «-Value »{ instructions ... return value}
-InputObject variable
Add-Member
«-MemberType »ScriptProperty
«-Name »Bar -SecondValue { instructions }
-InputObject variable
OCaml
F# member this.Bar with get() = expression and set(value) = expression member this.Bar = expression member this.Bar with set(value) = expression
COBOL METHOD-ID. GET PROPERTY bar.

DATA DIVISION.
LINKAGE SECTION.
return-var declaration
PROCEDURE DIVISION RETURNING return-var.

    instructions

END METHOD.
METHOD-ID. SET PROPERTY bar.
DATA DIVISION.
LINKAGE SECTION.
value-var declaration
PROCEDURE DIVISION USING value-var.

    instructions

END METHOD.

METHOD-ID. GET PROPERTY bar.

DATA DIVISION.
LINKAGE SECTION.
return-var declaration
PROCEDURE DIVISION RETURNING return-var.

    instructions

END METHOD.

METHOD-ID. SET PROPERTY bar.

DATA DIVISION.
LINKAGE SECTION.
value-var declaration
PROCEDURE DIVISION USING value-var.

    instructions

END METHOD.

Automatically implemented

read-write read-only write-only
ABAP Objects
C++ (STL)
C# type Bar { get; set; } type Bar { get; private set; } type Bar { private get; set; }
D
Java
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;
Swift var bar : type let bar : type
Eiffel
Python @property
def bar(self):
Tab ↹instructions
@bar.setter
def bar(self, value):
Tab ↹instructions
@property
def bar(self):
Tab ↹instructions
bar = property()
@bar.setter
def bar(self, value):
Tab ↹instructions
Visual Basic .NET Property Bar As type« = initial_value» (VB 10)
PHP
Perl[33] 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
Ruby attr_accessor :bar attr_reader :bar attr_writer :bar
Windows PowerShell
OCaml
F# member val Bar = value with get, set
COBOL level-number bar clauses PROPERTY. level-number bar clauses PROPERTY «WITH» NO SET. level-number bar clauses PROPERTY «WITH» NO GET.

Overloaded operators

Standard operators

unary binary function call
ABAP Objects
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 }
D type opUnary(string s)() if (s == "symbol") { instructions } type opBinary(string s)(type operand2) if (s == "symbol") { instructions }
type opBinaryRight(string s)(type operand1) if (s == "symbol") { switch (s) { instructions }
type opCall(«parameters») { instructions }
Java
Objective-C
Swift func symbol(operand1 : type) -> returntype { instructions } (outside class) func symbol(operand1 : type1, operand2 : type2) -> returntype { instructions } (outside class)
Eiffel[34] op_name alias "symbol": TYPE
do instructions end
op_name alias "symbol" (operand: TYPE1): TYPE2
do instructions end
Python def __opname__(self):
Tab ↹
instructions
Tab ↹ return
value
def __opname__(self, operand2):
Tab ↹
instructions
Tab ↹ return
value
def __call__(self«, paramters»):
Tab ↹
instructions
Tab ↹ return
value
Visual Basic .NET Shared Operator symbol(operand As type) As type
instructions
End Operator
Shared Operator symbol(operand1 As type, operand2 As type) As type
instructions
End Operator
Xojo Function Operator_name(operand As type) As type
instructions
End Function
PHP [35] 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
end
def symbol(operand2)
instructions
expression resulting in return value
end
Windows PowerShell
OCaml
F# static member (symbol) operand = expression static member (symbol) (operand1, operand2) = expression
COBOL

Indexers

read-write read-only write-only
ABAP Objects
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
Objective-C (recent Clang compiler) - (id)objectAtIndexedSubscript:(NSUInteger)index { instructions return value; } or
- (id)objectForKeyedSubscript:(id)index { instructions return value; }
- (void)setObject:(id)value atIndexedSubscript:(NSUInteger)index { instructions } or
- (void)setObject:(id)value forKeyedSubscript:(id)index { instructions }
Swift subscript (index : type) -> returntype { get { instructions } set«(newIndex)» { instructions } } subscript (index : type) -> returntype { instructions }
Eiffel[34] bracket_name alias "[]" (index: TYPE): TYPE assign set_item
do instructions end
set_item (value: TYPE; index: TYPE):
do instructions end
bracket_name alias "[]" (index: TYPE): TYPE
do instructions end
Python def __getitem__(self, index):
Tab ↹ instructions
Tab ↹ return value
def __setitem__(self, index, value):
Tab ↹ instructions
def __getitem__(self, index):
Tab ↹ instructions
Tab ↹ return value
def __setitem__(self, index, value):
Tab ↹ instructions
Visual Basic .NET Default Property Item(Index As type) As type
Get
instructions
End Get
Set(ByVal
Value As type)
instructions
End Set
End Property
Default ReadOnly Property Item(Index As type) As type
Get
instructions
End Get
End Property
Default WriteOnly Property Item(Index As type) As type
Set(ByVal
Value As type)
instructions
End Set
End Property
PHP [36]
Perl [37]
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; }
Ruby def [](index)
instructions
expression resulting in return value
end
def []=(index, value)
instructions
end
def [](index)
instructions
expression resulting in return value
end
def []=(index, value)
instructions
end
Windows PowerShell
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
COBOL

Type casts

downcast upcast
ABAP Objects
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
Objective-C
Eiffel[34]
Python
Visual Basic .NET Shared Narrowing Operator CType(operand As type) As returntype
instructions
End Operator
Shared Widening Operator CType(operand As type) As returntype
instructions
End Operator
Perl 6 multi method type«($self:)» is export { instructions }
PHP
Perl
Ruby
Windows PowerShell
OCaml
F#
COBOL

Member access

How to access members of an object x

object member class member namespace member
method field property
ABAP Objects x->methodparameters[38]»). x->field x=>field or x=>methodparameters[38]»).
C++ (STL) x.method(parameters) or
ptr->method(parameters)
x.field or
ptr->field
cls::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 ...»» cls method«:parameter «bar:parameter ...»»
Swift x.method(parameters) x.property cls.member
C# x.method(parameters) x.field x.property cls.member ns.member
Java
D x.property
Python
Visual Basic .NET
Xojo
Windows PowerShell [cls]::member
F# cls.member
Eiffel x.method«(parameters)» x.field {cls}.member
Ruby 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!field
cls.method«(parameters)» or
cls!method«(parameters)»
ns::member
OCaml x#method «parameters»
JavaScript x.method(parameters)
x["method"](parameters)
x.field
x["field"]
x.property
x["property"]
COBOL INVOKE x "method" «USING parameters» «RETURNING result» or

x::"method"«(«parameters»)»

property OF x INVOKE cls "method" «USING parameters» «RETURNING result» or

cls::"method"«(«parameters»)» or
property OF cls

Member availability

Has member? Handler for missing member
Method Field Method Field
ABAP Objects
C++ (STL)
Objective-C (Cocoa) [x respondsToSelector:@selector(method)] forwardInvocation:
Smalltalk x respondsTo: selector doesNotUnderstand:
C# (using reflection)
Java
D opDispatch()
Eiffel
Python hasattr(x, "method") and callable(x.method) hasattr(x, "field") __getattr__()
Visual Basic .NET (using reflection)
Xojo (using Introspection)
Windows PowerShell (using reflection)
F# (using reflection)
Ruby x.respond_to?(:method) method_missing()
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
JavaScript typeof x.method === "function" field in x
COBOL

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 [39] NULL, nullptr
C# this base[40] null
Java super[40]
D
JavaScript null, undefined[41]
Objective-C self super[40] nil
Swift self super[40] nil[42]
Python self[43] super(current_class_name, self)[5]
super() (3.x only)
None
Visual Basic .NET Me MyBase Nothing
Xojo Me / Self Parent Nil
Eiffel Current Precursor «{superclass}» «(args)»[40][44] Void
PHP $this parent[40] null
Perl $self[43] $self->SUPER[40] undef
Perl 6 self SUPER Nil
Ruby self super«(args)»[45] nil binding
Windows PowerShell $this $NULL
OCaml self[46] super[47] [48]
F# this base[40] null
COBOL SELF SUPER NULL

Special methods

String representation Object copy Value equality Object comparison Hash code Object ID
Human-readable Source-compatible
ABAP Objects
C++ (STL) x == y[49] 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()[50] x.equals(y) x.compareTo(y)[51] 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][52] [x isEqual:y] [x compare:y][53] [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)[54] repr(x)[55] copy.copy(x)[56] x == y[57] cmp(x, y)[58] hash(x)[59] 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 use x.hash_code When x is IDENTIFIED, one can use x.object_id
PHP sprintf("%s", x)[60] clone x[61] x == y spl_object_hash(x)
Perl "$x"[62] Data::Dumper->Dump([$x],['x'])[63] Storable::dclone($x)[64] Scalar::Util::refaddr( $x )[65]
Perl 6 ~x[62] x.perl x.clone x eqv y x cmp y x.WHICH
Ruby x.to_s x.inspect x.dup or
x.clone
x == 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()
COBOL

Type manipulation

Get object type Is instance of (includes subtypes) Upcasting Downcasting
Runtime check No check
ABAP Objects [66] = ?=
C++ (STL) typeid(x) dynamic_cast<type *>(&x) != NULL [67] 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
Delphi x is type x as type
Java x.getClass() x instanceof class (type) x
Objective-C (Cocoa) [x class] [x isKindOfClass:[class class]] (type*) x
Swift x.dynamicType x is type x as type
JavaScript x.constructor (If not rewritten.) x instanceof class [68]
Visual Basic .NET x.GetType() TypeOf x Is type [67] CType(x, type) or TryCast(x, type)
Xojo Introspection.GetType(x) x IsA type CType(x, type)
Eiffel x.generating_type attached {TYPE} x attached {TYPE} x as down_x
Python type(x) isinstance(x, type) [68]
PHP get_class(x) x instanceof class
Perl ref(x) x->isa("class")
Perl 6 x.WHAT x.isa(class) [67] type(x) or
x.type
Ruby x.class x.instance_of?(type) or
x.kind_of?(type)
[68]
Smalltalk x class x isKindOf: class
Windows PowerShell x.GetType() x -is [type] [67] [type]x or x -as [type]
OCaml [69] (x :> type)
F# x.GetType() x :? type (x :?> type)
COBOL x AS type[67]

Namespace management

Import namespace Import item
qualified unqualified
ABAP Objects
C++ (STL) using namespace ns; using ns::item ;
C# using ns; using item = ns.item;
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; use ns qw(item);
Perl 6
Ruby
Windows PowerShell
OCaml open ns
F#
COBOL

Contracts

Precondition Postcondition Check Invariant Loop
ABAP Objects
C++ (STL)
C# Spec#:
type foo( «parameters» )
    requires expression
{
    body
}
Spec#:
type foo( «parameters» )
    ensures expression
{
    body
}
Java
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 end
f
do
ensure
tag: expression
end
f
do
check tag: expression end
end
class X
invariant tag: expression
end
from instructions
invariant
tag: expression
until
expr
loop
instructions
variant
tag: expression
end
Python
PHP
Perl
Perl 6 PRE { condition } POST { condition }
Ruby
Windows PowerShell
OCaml
F#
COBOL

See also

References and notes

  1. ^ parameter = argument may be repeated if the constructor has several parameters
  2. ^ SAP reserved to himself the use of destruction
  3. ^ a b c d e f g h i j This language uses garbage collection to release unused memory.
  4. ^ OCaml objects can be created directly without going through a class.
  5. ^ a b c d e f g This language supports multiple inheritance. A class can have more than one parent class
  6. ^ 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, or Object otherwise.
  7. ^ Usually the @interface portion is placed into a header file, and the @interface portion is placed into a separate source code file.
  8. ^ Prefixes to class and protocol names conventionally used as a kind of namespace
  9. ^ In Python interfaces are classes whose methods have pass as their bodies
  10. ^ The class is an Object.
    Just send a message to the superclass (st-80) or the destination namespace (Visualworks).
  11. ^ The namespace is an Object.
    Just send a message to the parent namespace.
  12. ^ 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.
  13. ^ 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
  14. ^ 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.
  15. ^ Any Eiffel procedure can be used as a creation procedure, aka constructors. See Eiffel paragraph at Constructor (computer science).
  16. ^ Implementing {DISPOSABLE}.dispose ensures that dispose will be called when object is garbage collected.
  17. ^ 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.
  18. ^ This syntax is usually used to overload constructors
  19. ^ In JavaScript, constructor itself is an object.
  20. ^ Constructors can be emulated with a factory method returning a class instance.
  21. ^ 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
  22. ^ 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.
  23. ^ 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.
  24. ^ Just send a message to the class
    class addInstVarName: field.
    class removeInstVarName: field.
    
  25. ^ a b c d Just assign a value to it in a method
  26. ^ Python doesn't have private fields - all fields are publically accessible at all times. A community convention exists to prefix implementation details with a single underscore, but this is not enforced at all by the language itself.
  27. ^ All class data is 'private' because the COBOL standard does not specify any way to access it.
  28. ^ 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.
  29. ^ In ABAP, the return parameter name is explicitly defined in the method signature within the class definition
  30. ^ 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»);
    The implementation of methods is usually provided in a separate source file, with the following syntax
    type class::foo(«parameters») { instructions }
    Although the body of a method could be included with the declaration inside the class definition, as shown in the table here, this is generally a bad idea. Because the class definition will need to be included with every source file which uses the fields or methods of the class, having code in the class definition will cause the method code to be compiled with every source file, increasing the size of the code. There are some circumstances, however, where it is useful to include the body of a method with the declaration. One reason is that the compiler will try to inline methods that are included in the class declaration; so if you have a very short one-liner method, it may make it faster to allow the compiler to inline it, by including the body along with the declaration. Also, if you have a template class or method, then all the code must be included with the declaration, because only with the code can the template be instantiated.
  31. ^ a b Just assign a function to it in a method
  32. ^ Alternative implementation:
    def bar():
        doc = "The bar property."
        def fget(self):
            return self._bar
        def fset(self, value):
            self._bar = value
        return locals()
    bar = property(**bar())
    
  33. ^ these examples need the Class::Accessor module installed
  34. ^ a b c Although Eiffel does not support overloading of operators, it can define operators
  35. ^ PHP does not support operator overloading natively, but support can be added using the "operator" PECL package.
  36. ^ Your class needs to implement the ArrayAccess interface.
  37. ^ Your class needs to overload '@{}' (array dereference) or subclass one of Tie::Array or Tie::StdArray to hook array operations
  38. ^ 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
  39. ^ 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]
  40. ^ a b c d e f g h The keyword here is not a value in itself and it can only be used to access a method of the superclass.
  41. ^ But be afraid, they have not the same value.
  42. ^ only for Optional types
  43. ^ 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.
  44. ^ "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.
  45. ^ "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.
  46. ^ 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.
  47. ^ 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.
  48. ^ 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 are None and Some x, which could be used to represent "null reference" and "non-null reference to an object" as in other languages.
  49. ^ assuming that "x" and "y" are the objects (and not a pointer). Can be customized by overloading the object's == operator
  50. ^ Only accessible from within the class itself, since the clone() method inherited from Object is protected, unless the class overrides the method and makes it public. If you use the clone() inherited from Object, your class will need to implement the Cloneable interface to allow cloning.
  51. ^ The class should implement the interface Comparable for this method to be standardized.
  52. ^ Implemented by the object's copyWithZone: method
  53. ^ compare: is the conventional name for the comparison method in Foundation classes. However, no formal protocol exists
  54. ^ Can be customized by the object's __str__() method
  55. ^ Can be customized by the object's __repr__() method
  56. ^ Can be customized by the object's __copy__() method
  57. ^ Can be customized by the object's __eq__() method
  58. ^ Only in Python 2.x and before (removed in Python 3.0). Can be customized by the object's __cmp__() method
  59. ^ Can be customized by the object's __hash__() method. Not all types are hashable (mutable types are usually not hashable)
  60. ^ Can be customized by the object's __toString() method
  61. ^ Can be customized by the object's __clone() method
  62. ^ a b Can be customized by overloading the object's string conversion operator
  63. ^ This example requires useing Data::Dumper
  64. ^ This example requires useing Storable
  65. ^ This example requires useing Scalar::Util
  66. ^ Run-time type information in ABAP can be gathered by using different description Classes like CL_ABAP_CLASSDESCR.
  67. ^ a b c d e Upcasting is implicit in this language. A subtype instance can be used where a supertype is needed.
  68. ^ a b c This language is dynamically typed. Casting between types is not necessary.
  69. ^ This language doesn't give run-time type information. It is unnecessary because it is statically typed and downcasting is not possible.