Comparison of programming languages (object-oriented programming)

{{Multiple issues|

{{cleanup|reason=This article's reference section contains many footnotes, but lists no external references or sources.|date=June 2013}}

{{More citations needed|date=January 2025}}

}}

{{ProgLangCompare}}

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

__TOC__

{{-}}

Object construction and destruction

class="wikitable"
! construction

! destruction

ABAP Objects

| data variable type ref to class .
create object variable «exporting parameter = argument».
parameter = argument may be repeated if the constructor has several parameters

|SAP reserved to himself the use of destructionThis language uses garbage collection to release unused memory.

APL (Dyalog)

| variable←⎕NEW class «parameters»

| ⎕EX 'variable'

C++

| class variable«(parameters)»;This syntax creates an object value with automatic storage duration or
class *variable = new class«(parameters)»;This syntax creates an object with dynamic storage duration and returns a pointer to it

| delete pointer;

C#

| rowspan=3|class variable = new class(parameters);

| variable.Dispose();

Java

|

D

| destroy(variable);

eC

| class «instance handle» { «properties/data members assignments, instance method overrides» }

| delete instance handle;

Objective-C (Cocoa)

| class *variable = *variable = [[class alloc ] initWithFoo:parameter «bar:parameter ...»];

| [variable release];

Swift

| let variable = class(parameters)

|

Python

| variable = class(parameters)

| del variable (Normally not needed)

Visual Basic .NET

| Dim variable As New class(parameters)

| variable.Dispose()

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)»

|

PHP

| $variable = new class«(parameters)»;

| unset($variable);

Perl 5

| «my »$variable = class->new«(parameters)»;

| undef($variable);

Raku

| «my »$variable = class.new«(parameters)»;

| $variable.undefine;

Ruby

| variable = class.new«(parameters)»

|

Windows PowerShell

| $variable = New-Object «-TypeName» class ««-ArgumentList» parameters»

| Remove-Variable «-Name» variable

OCaml

| let variable = new class «parameters» or
let variable = object members endOCaml objects can be created directly without going through a class.

| rowspan=2|

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:

Point x: 10 y: 20.

Array with: -1 with: 3 with: 2.

|

JavaScript

| var variable = new class«(parameters)» or
var variable = { «key1: value1«, key2: value2 ...»»}

|

{{nowrap|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

|

COBOL

| INVOKE class "NEW" RETURNING variable or
MOVE class::"NEW" TO variable

|

Cobra

| variable «as class» = class(parameters)

| variable.dispose

ISLISP

| (setq variable (create (class [:field-1 value-1 [:field-2 value-2] ..])))

|

Class declaration

class="wikitable"
! 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}}

APL (Dyalog)

| :Class name «:parentclass» «,interfaces»
members
:EndClass

| :Interface name
members
:EndInterface

| :Namespace name
members
:EndNamespace

C++

| class name« : public parentclassesThis language supports multiple inheritance. A class can have more than one parent class» { members };

|

| rowspan=2| namespace name { members }

C#

| rowspan=2| class name« : «parentclass»«, interfaces»» { members }

| rowspan=2| interface name« : parentinterfaces» { members }

D

| module name;
members

eC

| class name« : base class» { «default member values assignments» «members» }

|

| namespace name;

Java

| rowspan=2| class name« extends parentclass»« implements interfaces» { members }

| rowspan=2| interface name« extends parentinterfaces» { members }

| package name; members

PHP

| namespace name; members

Objective-C

| @interface name« : parentclass»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.«< protocols >» { instance_fields } method_and_property_declarations @end
@implementation
name method_implementations @end
Usually the @interface portion is placed into a header file, and the @interface portion is placed into a separate source code file.

| @protocol name«< parentprotocols >» members @end

| {{n/a|Prefixes to class and protocol names conventionally used as a kind of namespace}}

Swift

| class name« : «parentclass»«, protocols»» { members }

| protocol name« : parentprotocols» { members }

|

Python

| class name«(parentclasses)»:
{{keypress|Tab}}
members

|In Python interfaces are classes which methods have pass as their bodies

| __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»
members
end

| colspan=2 {{n/a}}

Perl

| package name; «@ISA = qw(parentclasses);» members 1;

|

| package name; members

Raku

| class name «is parentclass «is parentclass ...»» «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

| colspan=3 {{n/a}}

OCaml

| class name «parameters» = object «(self)» «inherit parentclass «parameters» «inherit parentclass «parameters» ...»» 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

|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.

JavaScript (ES6)

|class name «extends parentclass» { members }

|

|

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.

| {{n/a}}

Cobra

| class name «inherits parentclass» «implements interfaces»
{{keypress|Tab}} members

| interface name «inherits parentinterfaces»
{{keypress|Tab}} members

| namespace name
{{keypress|Tab}} members

ISLISP

| (defclass name (base-class) ((x :initform 0 :accessor get-x :initarg x)) (:abstractp nil))

|

|

Class members

= Constructors and destructors =

class="wikitable"
! constructor

! destructor

! finalizerA 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.

ABAP Objects

| methods constructor «importing parameter = argument»
method constructor. instructions endmethod.
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

| colspan=2 {{n/a}}

APL (Dyalog)

| name
:Implements Constructor «:Base «expr»»
instructions

|

| name
:Implements Destructor
instructions

C++

| class(«parameters») «: initializersAn 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.» { instructions }

| ~class() { instructions }

|

C#

| class(«parameters») { instructions }

| void Dispose(){ instructions }

| ~class() { instructions }

D

| this(«parameters») { instructions }

|

| ~this() { instructions }

eC

| class() { instructions }

| ~class() { instructions }

|

Java

| class(«parameters») { instructions }

|

| void finalize() { instructions }

Eiffel

|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.

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»):
{{keypress|Tab}} instructions

|

| def __del__(self):
{{keypress|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 }

|

Raku

| submethod BUILD { instructions } or
«multi » method new(««$self: »parameters») { self.bless(*, field1 => value1, ...); ... instructions }

| submethod DESTROY { instructions }

|

Ruby

| def initialize«(parameters)»
instructions
end

| colspan=2 {{n/a}}

Windows PowerShell

| colspan=3 {{n/a}}

OCaml

| initializer instructionsThis "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.

| colspan=2 {{n/a}}

F#

| do instructions or
new(parameters) = expression
This syntax is usually used to overload constructors

| member this.Dispose() = instructions

| override this.Finalize() = instructions

JavaScript

| function name(«parameters») { instructions }In JavaScript, constructor is an object.

| colspan=2 {{n/a}}

JavaScript (ES6)

|constructor(«parameters») { instructions }

COBOL

| {{n/a}}Constructors can be emulated with a factory method returning a class instance.

| colspan=2 {{n/a}}

Cobra

| cue init(parameters)
{{keypress|Tab}} base.init
{{keypress|Tab}} instructions

| def dispose
{{keypress|Tab}} instructions

|

ISLISP

| (defmethod initialize-object ((instance ) initvalues)

= Fields =

class="wikitable"
! public

! private

! protected

! friend

ABAP Objects

| public section.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 data field type type.

| private section. data field type type.

| protected section. data field type type.

|In ABAP, specific fields or methods are not declared as accessible by outside things. Rather, outside classes are declared as friends to have access to the class's fields or methods.

APL (Dyalog)

| :Field Public field « value»

| :Field «Private» field « value»

|

|

C++

| public: type field;

| private: type field;

| protected: type field;

|In C++, specific fields are not declared as accessible by outside things. Rather, outside functions and classes are declared as friends to have access to the class's fields. See friend function and friend class for more details.

C#

| rowspan=3| public type field «= value»;

| rowspan=3| 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»;

eC

| public type field;

| private type field;

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

| colspan=4 {{n/a}}

Smalltalk

| colspan=2 {{n/a}}

|Just send a message to the class

class addInstVarName: field.

class removeInstVarName: field.

| {{n/a}}

Python

| self.field = valueJust assign a value to it in a method

| {{n/a}}Python doesn't have private fields - all fields are publicly accessible at all times. A community convention exists to prefix implementation details with one underscore, but this is unenforced by the language.

| colspan=2 {{n/a}}

valign="top"

| Visual Basic .NET

| Public field As type «= value»

| Private field As type «= value»

| Protected field As type «= value»

| Friend field As type «= value»

valign="top"

| Xojo

| Public field As type «= value»

| Private field As type «= value»

| Protected field As type «= value»

| {{n/a}}

PHP

| public $field «= value»;

| private $field «= value»;

| protected $field «= value»;

|

Perl

| $self->{field} = value;

| colspan=3 {{n/a}}

Raku

| has« type »$.field« is rw»

| has« type »$!field

| colspan=2 {{n/a}}

Ruby

| colspan=2 {{n/a}}

| @field = value

|

Windows PowerShell

| Add-Member
«-MemberType »NoteProperty
«-Name »Bar «-Value »value
-InputObject variable

| colspan=3 {{n/a}}

OCaml

| colspan=2 {{n/a}}

| val «mutable» field = value

| rowspan=2 {{n/a}}

F#

| {{n/a}}

| let «mutable» field = value

| {{n/a}}

JavaScript

| this.field = value
this["field"] = value

|

|

|

COBOL

| {{n/a}}

| level-number field clauses.All class data is 'private' because the COBOL standard does not specify any way to access it.

| {{n/a}}

| {{n/a}}

Cobra

| var field «as type» «= value»

| var __field «as type» «= value»

| var _field «as type» «= value»

|

ISLISP

| (field :initform value :accessor accessor-name :initarg keyword)

|

|

|

= Methods =

class="wikitable"
valign="top"

!

! basic/void method

! value-returning method

valign="top"

| ABAP Objects

| methods name «importing parameter = argument» «exporting parameter = argument» «changing parameter = argument» «returning value(parameter)»
method name. instructions endmethod.
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

valign="top"

| APL (Dyalog)

| «left argument» name «right arguments»
instructions

| result «left argument» name «right arguments»
instructions

valign="top"

| C++In C++, declaring and implementing methods is usually separate. Methods are declared in 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 can be included with the declaration inside the class definition, as shown in the table here, this is generally bad practice. Because the class definition must be included with every source file which uses the fields or methods of the class, having code in the class definition causes the method code to be compiled with every source file, increasing the size of the code. Yet, in some circumstances, 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 a very short one-line method occurs, it may make it faster to allow a compiler to inline it, by including the body along with the declaration. Also, if a template class or method occurs, then all the code must be included with the declaration, because only with the code can the template be instantiated.

| rowspan=4| void foo(«parameters») { instructions }

| rowspan=4| type foo(«parameters») { instructions ... return value; }

valign="top"

| C#

valign="top"

| D

valign="top"

| Java

valign="top"

| eC

| void ««type of 'this'»::»foo(«parameters») { instructions }

| type ««type of this»::»foo(«parameters») { instructions ... return value; }

valign="top"

| Eiffel

| foo ( «parameters» )
do
instructions
end

| foo ( «parameters» ): TYPE
do
instructions...
Result := value
end

valign="top"

| Objective-C

| - (void)foo«:parameter «bar:parameter ...»» { instructions }

| - (type)foo«:parameter «bar:parameter ...»» { instructions... return value; }

valign="top"

| Swift

| func foo(«parameters») { instructions }

| func foo(«parameters») -> type { instructions... return value }

valign="top"

| Python

| def foo(self«, parameters»):
{{keypress|Tab}}
instructions

| def foo(self«, parameters»):
{{keypress|Tab}}
instructions
{{keypress|Tab}} return
value

valign="top"

| Visual Basic .NET

| Sub Foo(«parameters»)
instructions
End Sub

| Function Foo(«parameters») As type
instructions
...
Return value
End Function

valign="top"

| Xojo

| Sub Foo(«parameters»)
instructions
End Sub

| Function Foo(«parameters») As type
instructions
...
Return value
End Function

valign="top"

| PHP

| function foo(«parameters»)«: void» { instructions }

| function foo(«parameters»)«: type» { instructions ... return value; }

valign="top"

| Perl

| sub foo { my ($self«, parameters») = @_; instructions }

| sub foo { my ($self«, parameters») = @_; instructions ... return value; }

valign="top"

| Raku

| «has »«multi »method foo(««$self: »parameters») { instructions }

| «has «type »»«multi »method foo(««$self: »parameters») { instructions ... return value; }

valign="top"

| Ruby

| def foo«(parameters)»
instructions
end

| def foo«(parameters)»
instructions
expression resulting in return value
end
or
def foo«(parameters
instructions
return value
end

valign="top"

| 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

valign="top"

| OCaml

| rowspan=2 {{n/a}}

| method foo «parameters» = expression

valign="top"

| F#

| member this.foo(«parameters») = expression

valign="top"

| JavaScript

| this.method = function(«parameters») {instructions}
name«.prototype.method = function(«parameters») {instructions}
Just assign a function to it in a method

| this.method = function(«parameters») {instructions... return value;}
name«.prototype.method = function(«parameters») {instructions... return value;}

Javascript (ES6)

|foo(«parameters») {instructions}

|foo(«parameters») {instructions... return value;}

valign="top"

| 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.

Cobra

| def foo(parameters)
{{keypress|Tab}} instructions

| def foo(parameters) as type
{{keypress|Tab}} instructions
{{keypress|Tab}} return value

|

ISLISP

| (defgeneric method (arg1 arg2))
(defmethod method ((arg1 arg2 ) ...)

|

= Properties =

How to declare a property named "Bar"

== Manually implemented ==

class="wikitable"
valign="top"

!

! read-write

! read-only

! write-only

valign="top"

| ABAP Objects

| colspan=3 {{n/a}}

valign="top"

| APL (Dyalog)

| :Property Bar
result ← Get
instructions

∇ Set arguments
instructions

:EndProperty Bar

| :Property Bar
result ← Get
instructions

:EndProperty Bar

| :Property Bar
∇ Set arguments
instructions

:EndProperty Bar

valign="top"

| C++

| colspan=3 {{n/a}}

valign="top"

| C#

| type Bar {
get {
instructions ... return value; }
set {
instructions } }

| type Bar { get { instructions ... return value; } }

| type Bar { set { instructions } }

valign="top"

| 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; }

valign="top"

| eC

| property type Bar {
get {
instructions ... return value; }
set {
instructions } }

| property type Bar { get { instructions ... return value; } }

| property type Bar { set { instructions } }

valign="top"

| Java

| colspan=3 {{n/a}}

valign="top"

| 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 }

| {{n/a}}

valign="top"

| Swift

| var bar : type { get { instructions } set«(newBar)» { instructions } }

| var bar : type { instructions }

| {{n/a}}

valign="top"

| Eiffel

| feature -- Access
x: TYPE assign set_x
feature -- Settings
set_x (a_x: like x) do instructions ensure x_set: verification end

|

|

valign="top"

| Python

| def setBar(self, value):
{{keypress|Tab}} instructions
def
getBar(self):
{{keypress|Tab}}
instructions
{{keypress|Tab}} return value
bar = property(getBar, setBar)
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())

| def getBar(self):
{{keypress|Tab}} instructions
{{keypress|Tab}} return value
bar = property(getBar)

| def setBar(self, value):
{{keypress|Tab}} instructions
bar = property(fset = setBar)

valign="top"

| 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

valign="top"

| 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

valign="top"

| 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
} }

valign="top"

| 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";
}
}

valign="top"

| Raku

| colspan=3 {{n/a}}

valign="top"

| 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

valign="top"

| 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

valign="top"

| OCaml

| colspan=3 {{n/a}}

valign="top"

| F#

| member this.Bar with get() = expression and set(value) = expression

| member this.Bar = expression

| member this.Bar with set(value) = expression

JavaScript (ES6)

|get bar(«parameters») { instructions ... return value}set bar(«parameters») { instructions }

|get bar(«parameters») { instructions ... return value}

|set bar(«parameters») { instructions }

valign="top"

| 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.

Cobra

| pro bar «as type»
{{keypress|Tab}} get
{{keypress|Tab}}{{keypress|Tab}} instructions
{{keypress|Tab}}{{keypress|Tab}} return value
{{keypress|Tab}} set
{{keypress|Tab}}{{keypress|Tab}} instructions

| get bar «as type»
{{keypress|Tab}} instructions
{{keypress|Tab}} return value

| set bar «as type»
{{keypress|Tab}} instructions

valign="top"

| ISLISP

| colspan=3 {{n/a}}

== Automatically implemented ==

class="wikitable"
valign="top"

!

! read-write

! read-only

! write-only

valign="top"

| ABAP Objects

| colspan=3 {{n/a}}

valign="top"

| C++

| colspan=3 {{n/a}}

valign="top"

| C#

| type Bar { get; set; }

| type Bar { get; private set; }

| type Bar { private get; set; }

valign="top"

| D

| colspan=3 {{n/a}}

valign="top"

| Java

| colspan=3 {{n/a}}

valign="top"

| 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;

| {{n/a}}

valign="top"

| Swift

| var bar : type

| let bar : type

| {{n/a}}

valign="top"

| Eiffel

|

|

|

valign="top"

| Python

| @property
def bar(self):
{{keypress|Tab}}instructions
@bar.setter
def bar(self, value):
{{keypress|Tab}}instructions

| @property
def bar(self):
{{keypress|Tab}}instructions

| bar = property()
@bar.setter
def bar(self, value):
{{keypress|Tab}}instructions

valign="top"

| Visual Basic .NET

| Property Bar As type« = initial_value» (VB 10)

|

|

valign="top"

| PHP

|

|

|

valign="top"

| Perlthese examples need the [https://metacpan.org/module/Class::Accessor Class::Accessor] module installed

| 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');

valign="top"

| Raku

| colspan=3 {{n/a}}

valign="top"

| Ruby

| attr_accessor :bar

| attr_reader :bar

| attr_writer :bar

valign="top"

| Windows PowerShell

|

|

|

valign="top"

| OCaml

| colspan=3 {{n/a}}

valign="top"

| F#

| member val Bar = value with get, set

|

|

valign="top"

| COBOL

| level-number bar clauses PROPERTY.

| level-number bar clauses PROPERTY «WITH» NO SET.

| level-number bar clauses PROPERTY «WITH» NO GET.

Cobra

| pro bar from var «as type»

| get bar from var «as type»

| set bar from var «as type»

= Overloaded operators =

== Standard operators ==

class="wikitable"

|

! unary

! binary

! function call

ABAP Objects

| colspan=3 {{n/a}}

C++

| type operator symbol () { instructions }

| type operator symbol (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)() 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

| rowspan=2 colspan=3 {{n/a}}

Objective-C
Swift

| func symbol(operand1 : type) -> returntype { instructions } (outside class)

| func symbol(operand1 : type1, operand2 : type2) -> returntype { instructions } (outside class)

|

EiffelAlthough Eiffel does not support overloading of operators, it can define operators

| op_name alias "symbol": TYPE
do instructions end

| op_name alias "symbol" (operand: TYPE1): TYPE2
do instructions end

|

Python

| def __opname__(self):
{{keypress|Tab}}
instructions
{{keypress|Tab}} return
value

| def __opname__(self, operand2):
{{keypress|Tab}}
instructions
{{keypress|Tab}} return
value

| def __call__(self«, parameters»):
{{keypress|Tab}}
instructions
{{keypress|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

| {{n/a}}

Xojo

| Function Operator_name(operand As type) As type
instructions
End Function

| colspan=2 {{n/a}}

PHP

| colspan=2|PHP does not support operator overloading natively, but support can be added using the [http://pecl.php.net/package/operator "operator" PECL package].

| 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 };

|

Raku

| «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

| {{n/a}}

Windows PowerShell

| rowspan=2 colspan=3 {{n/a}}

OCaml
F#

| static member (symbol) operand = expression

| static member (symbol) (operand1, operand2) = expression

| {{n/a}}

COBOL

| colspan=3 {{n/a}}

ISLISP

| colspan=3 {{n/a}}

== Indexers ==

class="wikitable"

|

! read-write

! read-only

! write-only

valign="top"

| ABAP Objects

| colspan=3 {{n/a}}

valign="top"

| APL (Dyalog)

| :Property Numbered Default name
result ← Get
instructions

∇ Set arguments
instructions

:EndProperty Bar

| :Property Numbered Default Bar
result ← Get
instructions

:EndProperty Bar

| :Property Numbered Default Bar
∇ Set arguments
instructions

:EndProperty Bar

valign="top"

| C++

| type& operator[](type index) { instructions }

| type operator[](type index) { instructions }

|

valign="top"

| C#

| type this[type index] {
get{
instructions }
set{
instructions } }

| type this[type index] { get{ instructions } }

| type this[type index] { set{ instructions } }

valign="top"

| 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 }

valign="top"

| Java

| colspan=3 {{n/a}}

valign="top"

| Objective-C (recent Clang compiler)

| {{n/a}}

| - (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 }

valign="top"

| Swift

| subscript (index : type) -> returntype { get { instructions } set«(newIndex)» { instructions } }

| subscript (index : type) -> returntype { instructions }

|

valign="top"

| Eiffel

| 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

|

valign="top"

| Python

| def __getitem__(self, index):
{{keypress|Tab}} instructions
{{keypress|Tab}} return value
def __setitem__(self, index, value):
{{keypress|Tab}} instructions

| def __getitem__(self, index):
{{keypress|Tab}} instructions
{{keypress|Tab}} return value

| def __setitem__(self, index, value):
{{keypress|Tab}} instructions

valign="top"

| 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

valign="top"

| PHP

|colspan=3|The class must implement the [http://www.php.net/manual/en/class.arrayaccess.php ArrayAccess interface].

valign="top"

| Perl

|colspan=3|The class must overload '@{}' (array dereference) or subclass one of Tie::Array or Tie::StdArray to hook array operations

valign="top"

| Raku

| «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}}

valign="top"

| 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

valign="top"

| Windows PowerShell

| rowspan=2 colspan=3 {{n/a}}

valign="top"

| OCaml

valign="top"

| F#

| member this{{Not a typo|.}}Item with get(index) = expression and set index value = expression

| member this{{Not a typo|.}}Item with get(index) = expression

| member this{{Not a typo|.}}Item with set index value = expression

valign="top"

| COBOL

| colspan=3 {{n/a}}

Cobra

| pro[index «as type»] as type
{{keypress|Tab}} get
{{keypress|Tab}}{{keypress|Tab}} instructions
{{keypress|Tab}}{{keypress|Tab}} return value
{{keypress|Tab}} set
{{keypress|Tab}}{{keypress|Tab}} instructions

| get[index «as type»] as type
{{keypress|Tab}} instructions
{{keypress|Tab}} return value

| set[index «as type»] as type
{{keypress|Tab}} instructions

== Type casts ==

class="wikitable"

|

! downcast

! upcast

ABAP Objects

| colspan=2 {{n/a}}

C++

|

| 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 }

eC

|

| property T { get { return «conversion code»; } }

Java

| rowspan=4 colspan=2 {{n/a}}

Objective-C
Eiffel
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

PHP

| rowspan=2 colspan=2 {{n/a}}

Perl
Raku

|

| multi method type«($self:)» is export { instructions }

Ruby

| rowspan=3 colspan=2 {{n/a}}

Windows PowerShell
OCaml
F#

|

|

COBOL

| colspan=2 {{n/a}}

Member access

How to access members of an object x

class="wikitable"
! colspan=3| object member

! rowspan=2| class member

! rowspan=2| namespace member

! method

! field

! property

ABAP Objects

| x->methodparameters»).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

| x->field

| {{n/a}}

| x=>field or x=>methodparameters»).

| {{n/a}}

C++

| 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 ...»»

| {{n/a}}

|

| cls method«:parameter «bar:parameter ...»»

|

Swift

| x.method(parameters)

|

| x.property

| cls.member

|

APL (Dyalog)

| left argument» x.method «right argument(s)»

| rowspan=8| x.field

| x.property

| rowspan=7| cls.member

| rowspan=9| ns.member

C#

| rowspan=8| x.method(parameters)

Java

| {{n/a}}

D

| rowspan=6| x.property

Python
Visual Basic .NET
Xojo
Windows PowerShell

| [cls]::member

F#

| {{n/a}}

| cls.member

eC

| x.method«(parameters)»

| x.field

| x.property

| cls::member

| ns::member

Eiffel

| rowspan=2|x.method«(parameters)»

| x.field

|

| {cls}.member

| rowspan=2 {{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

Raku

| 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»

| colspan=2 {{n/a}}

|

|

JavaScript

| x.method(parameters)
x["method"](parameters)

| x.field
x["field"]

| x.property
x["property"]

| cls.member
cls["member"]

| {{n/a}}

COBOL

| INVOKE x "method" «USING parameters» «RETURNING result» or
x::"method"«(«parameters»)»

| {{n/a}}

| property OF x

| INVOKE cls "method" «USING parameters» «RETURNING result» or
cls::"method"«(«parameters»)» or
property OF cls

| {{n/a}}

Cobra

| x.method«(parameters)»

| x.field

| x.property

| cls.member

| ns.member

Member availability

class="wikitable"
! colspan=2| Has member?

! colspan=2| Handler for missing member

! Method

! Field

! Method

! Field

APL (Dyalog)

| 3=x.⎕NC'method'

| 2=x.⎕NC'method'

| colspan=2 {{n/a}}

ABAP Objects

| rowspan=2 colspan=4 {{n/a}}

C++
Objective-C (Cocoa)

| [x respondsToSelector:@selector(method)]

| {{n/a}}

| forwardInvocation:

| {{n/a}}

Smalltalk

| x respondsTo: selector

| {{n/a}}

| doesNotUnderstand:

| {{n/a}}

C#

| rowspan=3 colspan=4| (using reflection)

eC
Java
D

|

|

| colspan=2| opDispatch()

Eiffel

| colspan=4 {{n/a}}

Python

| hasattr(x, "method") and callable(x.method)

| hasattr(x, "field")

| colspan=2 | __getattr__()

Visual Basic .NET

| colspan=4 |(using reflection)

Xojo

| colspan=4 |(using Introspection)

Windows PowerShell

| colspan=4 |(using reflection)

F#

| colspan=4 |(using reflection)

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

|

Raku

| x.can("method")

| x.field.defined

| AUTOLOAD

|

OCaml

| colspan=4 {{n/a}}

JavaScript

| typeof x.method === "function"

| field in x

|

|

COBOL

| colspan=4 {{n/a}}

Special variables

class="wikitable"
! current object

! current object's parent object

! null reference

! Current Context of Execution

Smalltalk

| self

| super

| nil

| thisContext

ABAP Objects

| me

| super

| initial

|

APL (Dyalog)

| ⎕THIS

| ⎕BASE

| ⎕NULL

|

C++

| *this

|C++ doesn't have a "super" keyword, because multiple inheritance is possible, and so it may be ambiguous which base class is referenced. Instead, the BaseClassName::member syntax can be used 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 unsupported in other compilers.[http://msdn.microsoft.com/en-us/library/94dw1w7x.aspx]

| NULL, nullptr

|

C#

| rowspan=4| this

| baseThe keyword here is not a value, and it can only be used to access a method of the superclass.

| rowspan=3| null

|

Java

| rowspan=2| super

|

D

|

JavaScript

| super (ECMAScript 6)

| null, undefinedBut be afraid, they have not the same value.

|

eC

| this

|

| null

|

Objective-C

| self

| super

| nil

|

Swift

| self

| super

| nilonly for Optional types

|

Python

| selfIn 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.

| super(current_class_name, self)
super() (3.x only)

| None

|

Visual Basic .NET

| Me

| MyBase

| Nothing

|

Xojo

| Me / Self

| Parent

| Nil

|

Eiffel

| Current

| Precursor «{superclass}» «(args)»"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.

| Void

|

PHP

| $this

| parent

| null

|

Perl

| $self

| $self->SUPER

| undef

|

Raku

| self

| SUPER

| Nil

|

Ruby

| self

| super«(args)»"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.

| nil

| binding

Windows PowerShell

| $this

|

| $NULL

|

OCaml

| selfIn 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.

| superIn 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 given to the variable associated with this parent object. It can be named differently.

| {{n/a}}However, if the ability to have an "optional" value in OCaml is needed, then wrap the value inside an option type, which 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.

|

F#

| this

| base

| null

|

COBOL

| SELF

| SUPER

| NULL

|

Cobra

| this

| base

| nil

|

Special methods

class="wikitable"
rowspan=2|

!colspan=2| String representation

!rowspan=2| Object copy

!rowspan=2| Value equality

!rowspan=2| Object comparison

!rowspan=2| Hash code

!rowspan=2| Object ID

Human-readable

! Source-compatible

ABAP Objects

| colspan=7 {{n/a}}

APL (Dyalog)

| x

| ⎕SRC x

| ⎕NS x

| x = y

| colspan=2 {{n/a}}

C++

|

|

|

| x == yassuming that "x" and "y" are the objects (and not pointers). Can be customized by overloading the object's == operator

|

|

| 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()Only accessible from within the class, since the clone() method inherited from Object is protected, unless the class overrides the method and makes it public. If using the clone() inherited from Object, the class must implement the Cloneable interface to allow cloning.

| x.equals(y)

| x.compareTo(y)The class should implement the interface Comparable for this method to be standardized.

| x.hashCode()

| System.identityHashCode(x)

JavaScript

| x.toString()

|

|

|

|

|

|

D

| x.toString() or
std.conv.to!string(x)

| x.stringof

|

| x == y or
x.opEquals(y)

| x.opCmp(y)

| x.toHash()

|

eC

| x.OnGetString(tempString, null, null) or
PrintString(x)

|

| y.OnCopy(x)

|

| x.OnCompare(y)

|

| object handle can be converted into an integer ID

Objective-C (Cocoa)

| x.description

| x.debugDescription

| [x copy]Implemented by the object's copyWithZone: method

| [x isEqual:y]

| [x compare:y]compare: is the conventional name for the comparison method in Foundation classes. However, no formal protocol exists

| x.hash

| pointer to object can be converted into an integer ID

Swift

| x.descriptionOnly if object conforms to the Printable protocol

| x.debugDescriptionOnly if object conforms to the DebugPrintable protocol

|

| x == yOnly if object conforms to the Equatable protocol

| x < yOnly if object conforms to the Comparable protocol

| x.hashValueOnly if object conforms to the hashValue protocol

| reflect(x).objectIdentifier!.uintValue()

Smalltalk

| x displayString

| x printString

| x copy

| x = y

|

| x hash

| x identityHash

Python

| str(x)Can be customized by the object's __str__() method

| repr(x)Can be customized by the object's __repr__() method

| copy.copy(x)Can be customized by the object's __copy__() method

| x == yCan be customized by the object's __eq__() method

| cmp(x, y)Only in Python 2.x and before (removed in Python 3.0). Can be customized by the object's __cmp__() method

| hash(x)Can be customized by the object's __hash__() method. Not all types are hashable (mutable types are usually not hashable)

| 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

| $x->__toString()

|

| clone xCan be customized by the object's __clone() method

| x == y

|

|

| spl_object_hash(x)

Perl

| "$x"Can be customized by overloading the object's string conversion operator

| Data::Dumper->Dump([$x],[{{'}}x{{'}}])This example requires useing Data::Dumper

| Storable::dclone($x)This example requires useing Storable

|

|

|

| Scalar::Util::refaddr( $x )This example requires useing Scalar::Util

Raku

| ~x

| 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

| colspan=7 {{n/a}}

Type manipulation

class="wikitable"
rowspan=2|

! rowspan=2| Get object type

! rowspan=2| Is instance of (includes subtypes)

! rowspan=2| Upcasting

! colspan=2| Downcasting

Runtime check

! No check

ABAP Objects

| colspan=2 {{n/a}}Run-time type information in ABAP can be gathered by using different description Classes like CL_ABAP_CLASSDESCR.

| =

| ?=

C++

| typeid(x)

| dynamic_cast<type *>(&x) != nullptr

| rowspan=8 {{n/a}}Upcasting is implicit in this language. A subtype instance can be used where a supertype is needed.

| 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

|

eC

| x._class

| eClass_IsDerived(x._class, type)

|

| (type) x

Java

| x.getClass()

| x instanceof class

| (type) x

|

Objective-C (Cocoa)

| [x class]Only for non-class objects. If x is a class object, [x class] returns only x. The runtime method object_getClass(x) will return the class of x for all objects.

| [x isKindOfClass:[class class]]

|

| (type*) x

Swift

| x.dynamicType

| x is type

| x as! type
x as? type

JavaScript

| x.constructor (If not rewritten.)

| x instanceof class

| colspan=3 {{n/a}}This language is dynamically typed. Casting between types is unneeded.

Visual Basic .NET

| x.GetType()

| TypeOf x Is type

| {{n/a}}

| CType(x, type) or TryCast(x, type)

|

Xojo

| Introspection.GetType(x)

| x IsA type

| {{n/a}}

| CType(x, type)

| {{n/a}}

Eiffel

| x.generating_type

| attached {TYPE} x

| attached {TYPE} x as down_x

|

Python

| type(x)

| isinstance(x, type)

| colspan=3 rowspan=3 {{n/a}}

PHP

| get_class(x)

| x instanceof class

Perl

| ref(x)

| x->isa("class")

Raku

| x.WHAT

| x.isa(class)

| {{n/a}}

| type(x) or
x.type

|

Ruby

| x.class

| x.instance_of?(type) or
x.kind_of?(type)

| colspan=3 rowspan=2 {{n/a}}

Smalltalk

| x class

| x isKindOf: class

Windows PowerShell

| x.GetType()

| x -is [type]

| {{n/a}}

| [type]x or x -as [type]

|

OCaml

| colspan=2 {{n/a}}This language doesn't give run-time type information. It is unneeded because it is statically typed and downcasting is impossible.

| rowspan=2| (x :> type)

| colspan=2 {{n/a}}

F#

| x.GetType()

| x :? type

| (x :?> type)

|

COBOL

| colspan=2 {{n/a}}

| x AS type

| colspan=2 {{n/a}}

Namespace management

class="wikitable"
rowspan=2|

! colspan=2| Import namespace

! rowspan=2| Import item

qualified

! unqualified

ABAP Objects

|

|

|

C++

|

| 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

| rowspan=2| use ns;

|

| use ns qw(item);

Raku

|

|

Ruby

|

|

|

Windows PowerShell

|

|

|

OCaml

|

| rowspan=2| open ns

|

F#

|

|

COBOL

| colspan=3 {{n/a}}

Contracts

class="wikitable"
! Precondition

! Postcondition

! Check

! Invariant

! Loop

ABAP Objects

| colspan=5 rowspan=2 {{n/a}}

C++
C#

| Spec#:
type foo( «parameters» )
    requires expression
{
    body
}

| Spec#:
type foo( «parameters» )
    ensures expression
{
    body
}

Java

| colspan=5 rowspan=3 {{n/a}}

Objective-C
Visual Basic .NET
D

| f
in { asserts }
body{
instructions }

| f
out (result) { asserts }
body{
instructions }

| assert(expression)

| 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

| colspan=5 rowspan=3 {{n/a}}

PHP
Perl
Raku

| PRE { condition }

| POST { condition }

|

|

|

Ruby

| colspan=5 rowspan=5 {{n/a}}

Windows PowerShell
OCaml
F#
COBOL

See also

Notes

{{Reflist|2}}

References