Comparison of programming languages (object-oriented programming): Difference between revisions
→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" / |
| 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 article may require cleanup to meet Wikipedia's quality standards. The specific problem is: This article's reference section contains many footnotes, but not does not list any external references or sources. (June 2013) |
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
|
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)» |
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».
|
INTERFACE-ID. name« INHERITS« FROM» interfaces».
|
— |
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.
|
METHOD-ID. 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.
|
METHOD-ID. GET PROPERTY bar.
|
METHOD-ID. SET PROPERTY bar.
|
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->method(«parameters[38]»). | x->field | — | x=>field or x=>method(«parameters[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
|
— | property OF x
|
INVOKE cls "method" «USING parameters» «RETURNING result» or
|
— |
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 | |
Java | x.toString() | x.clone()[50] | x.equals(y) | x.compareTo(y)[51] | x.hashCode() | System | |
JavaScript | x.toString() | ||||||
D | x.toString() or std.conv |
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 |
Storable |
Scalar | |||
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 |
Oo.id x | |||
F# | string x or x |
sprintf "%A" x | x.Clone() | x = y or x |
compare x y or x |
hash x or x |
|
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
- ^ parameter = argument may be repeated if the constructor has several parameters
- ^ SAP reserved to himself the use of destruction
- ^ a b c d e f g h i j This language uses garbage collection to release unused memory.
- ^ OCaml objects can be created directly without going through a class.
- ^ a b c d e f g This language supports multiple inheritance. A class can have more than one parent class
- ^ Not providing a parent class makes the class a root class. In practice, this is almost never done. One should generally use the conventional base class of the framework one is using, which is
NSObject
for Cocoa and GNUstep, orObject
otherwise. - ^ Usually the
@interface
portion is placed into a header file, and the@interface
portion is placed into a separate source code file. - ^ Prefixes to class and protocol names conventionally used as a kind of namespace
- ^ In Python interfaces are classes whose methods have pass as their bodies
- ^ 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. - ^ A finalizer is called by the garbage collector when an object is about to be garbage-collected. There is no guarantee on when it will be called or if it will be called at all.
- ^ In ABAP, the constructor is to be defined like a method (see comments about method) with the following restrictions: the method name must be "constructor", and only "importing" parameters can be defined
- ^ An optional comma-separated list of initializers for member objects and parent classes goes here. The syntax for initializing member objects is
- "member_name(parameters)"
- "class_name(parameters)".
- ^ Any Eiffel procedure can be used as a creation procedure, aka constructors. See Eiffel paragraph at Constructor (computer science).
- ^ Implementing {DISPOSABLE}.dispose ensures that dispose will be called when object is garbage collected.
- ^ This "initializer" construct is rarely used. Fields in OCaml are usually initialized directly in their declaration. Only when additional imperative operations are needed is "initializer" used. The "parameters to the constructor" in other languages are instead specified as the parameters to the class in OCaml. See the class declaration syntax for more details.
- ^ This syntax is usually used to overload constructors
- ^ In JavaScript, constructor itself is an object.
- ^ Constructors can be emulated with a factory method returning a class instance.
- ^ a b c Scope identifier must appear once in the file declaration, all variable declarations after this scope identifier have his scope, until another scope identifier or the end of class declaration is reached
- ^ In ABAP, you don't declare specific fields or methods to be accessible by outside things. Rather, you declare outside classes to be friends to have access to the class's fields or methods.
- ^ In C++, you don't declare specific fields to be accessible by outside things. Rather, you declare outside functions and classes to be friends to have access to the class's fields. See friend function and friend class for more details.
- ^ Just send a message to the class
class addInstVarName: field. class removeInstVarName: field.
- ^ a b c d Just assign a value to it in a method
- ^ 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.
- ^ All class data is 'private' because the COBOL standard does not specify any way to access it.
- ^ The declaration and implementation of methods in ABAP are separate. methods statement is to be used inside the class definition. method (without "s") is to be used inside the class implementation. parameter = argument can be repeated if there are several parameters.
- ^ In ABAP, the return parameter name is explicitly defined in the method signature within the class definition
- ^ The declaration and implementation of methods in C++ are usually separate. Methods are declared inside the class definition (which is usually included in a header file) using the syntax
- type foo(«parameters»);
- type class::foo(«parameters») { instructions }
- ^ a b Just assign a function to it in a method
- ^ 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())
- ^ these examples need the Class::Accessor module installed
- ^ a b c Although Eiffel does not support overloading of operators, it can define operators
- ^ PHP does not support operator overloading natively, but support can be added using the "operator" PECL package.
- ^ Your class needs to implement the ArrayAccess interface.
- ^ Your class needs to overload '@{}' (array dereference) or subclass one of Tie::Array or Tie::StdArray to hook array operations
- ^ a b In ABAP, arguments must be passed using this syntax:
- x->method(«exporting parameter = argument» «importing parameter = argument» «changing parameter = argument» «returning value(parameter)»
- parameter = argument can be repeated if there are several parameters
- ^ C++ doesn't have a "super" keyword, because multiple inheritance is possible, and so it may be ambiguous which base class is desired. Instead, you can use the
BaseClassName::member
syntax to access an overridden member in the specified base class. Microsoft Visual C++ provides a non-standard keyword "__super" for this purpose; but this is not supported in other compilers.[1] - ^ a b c d e f g h The keyword here is not a value in itself and it can only be used to access a method of the superclass.
- ^ But be afraid, they have not the same value.
- ^ only for Optional types
- ^ a b In this language, instance methods are passed the current object as the first parameter, which is conventionally named "self", but this is not required to be the case.
- ^ "Precursor" in Eiffel is actually a call to the method of the same name in the superclass. So Precursor(args) is equivalent to "super.currentMethodName(args)" in Java. There is no way of calling a method of different name in the superclass.
- ^ "super" in Ruby, unlike in other languages, is actually a call to the method of the same name in the superclass. So super(args) in Ruby is equivalent to "super.currentMethodName(args)" in Java. There is no way of calling a method of different name in the superclass.
- ^ In OCaml, an object declaration can optionally start with a parameter which will be associated with the current object. This parameter is conventionally named "self", but this is not required to be the case. It is good practice to put a parameter there so that one can call one's own methods.
- ^ In OCaml, an inheritance declaration ("inherit") can optionally be associated with a value, with the syntax "inherit parent_class «parameters» as super". Here "super" is the name we gave to the variable associated with this parent object. It can be named something else.
- ^ However, if you really wanted the ability to have an "optional" value in OCaml, you would wrap the value inside an
option
type, whose values areNone
andSome x
, which could be used to represent "null reference" and "non-null reference to an object" as in other languages. - ^ assuming that "x" and "y" are the objects (and not a pointer). Can be customized by overloading the object's
==
operator - ^ Only accessible from within the class itself, since the
clone()
method inherited fromObject
is protected, unless the class overrides the method and makes it public. If you use theclone()
inherited fromObject
, your class will need to implement theCloneable
interface to allow cloning. - ^ The class should implement the interface
Comparable
for this method to be standardized. - ^ Implemented by the object's
copyWithZone:
method - ^
compare:
is the conventional name for the comparison method in Foundation classes. However, no formal protocol exists - ^ Can be customized by the object's
__str__()
method - ^ Can be customized by the object's
__repr__()
method - ^ Can be customized by the object's
__copy__()
method - ^ Can be customized by the object's
__eq__()
method - ^ Only in Python 2.x and before (removed in Python 3.0). Can be customized by the object's
__cmp__()
method - ^ Can be customized by the object's
__hash__()
method. Not all types are hashable (mutable types are usually not hashable) - ^ Can be customized by the object's
__toString()
method - ^ Can be customized by the object's
__clone()
method - ^ a b Can be customized by overloading the object's string conversion operator
- ^ This example requires useing Data::Dumper
- ^ This example requires useing Storable
- ^ This example requires useing Scalar::Util
- ^ Run-time type information in ABAP can be gathered by using different description Classes like CL_ABAP_CLASSDESCR.
- ^ a b c d e Upcasting is implicit in this language. A subtype instance can be used where a supertype is needed.
- ^ a b c This language is dynamically typed. Casting between types is not necessary.
- ^ This language doesn't give run-time type information. It is unnecessary because it is statically typed and downcasting is not possible.