Comparación de lenguajes de programación (programación orientada a objetos)

Esta comparación de lenguajes de programación compara cómo los lenguajes de programación orientados a objetos como C++ , Java , Smalltalk , Object Pascal , Perl , Python y otros manipulan las estructuras de datos .

Construcción y destrucción de objetos

construccióndestrucción
Objetos ABAPdata variable type ref to class .
create object variable «exporting parameter = argument».
[1]
[2] [3]
APL (dialog)variable←⎕NEW class «parameters»⎕EX 'variable'
C++class variable«(parameters)»;[4] o [5]
class *variable = new class«(parameters)»;
delete pointer;
DO#class variable = new class(parameters);variable.Dispose();[3]
Java[3]
Ddestroy(variable);
CEclass «instance handle» { «properties/data members assignments, instance method overrides» }delete instance handle;
Objetivo-C ( Cacao )class *variable = [[class alloc ] init];o
class *variable = [[class alloc ] initWithFoo:parameter «bar:parameter ...»];
[variable release];
Rápidolet variable = class(parameters)
Pitónvariable = class(parameters)del variable[3] (Normalmente no es necesario)
Visual Basic .NETDim variable As New class(parameters)variable.Dispose()[3]
XojoDim variable As New class(parameters)variable = Nil
Torre Eiffelcreate variableo o o
create «{TYPE}» variable.make_foo «(parameters)»
variable := create {TYPE}
variable := create {TYPE}.make_foo «(parameters)»
[3]
PHP$variable = new class«(parameters)»;unset($variable);[3]
Perl 5«my »$variable = class->new«(parameters)»;undef($variable);
Raku«my »$variable = class.new«(parameters)»;$variable.undefine;
Rubívariable = class.new«(parameters)»[3]
Windows PowerShell$variable = New-Object «-TypeName» class ««-ArgumentList» parameters»Remove-Variable «-Name» variable
OCamllet variable = new class «parameters»o [6]
let variable = object members end
[3]
F#let variable = «new »class(«parameters»)
Charla informalLa clase es un objeto.
Simplemente envíe un mensaje a una clase, generalmente #newo #new:y muchos otros, por ejemplo:
Punto  x:  10  y:  20 . Matriz  con:  -1  con:  3  con:  2 .
JavaScriptvar variable = new class«(parameters)»o
var variable = { «key1: value1«, key2: value2 ...»»}
[3]
Objeto Pascal ( Delphi )ClassVar := ClassType.ConstructorName(parameters);ClassVar.Free;
Escala
val obj = new Object // sin parámetros val obj = new Object ( arg0 , arg1 , arg2 ...) val obj = Object ( arg0 , arg1 , arg2 ...) // clase de caso val obj = new Object ( arg0 , arg1 , param1 = value1 , ...) // parámetros nombrados                           
[3]
COBOLINVOKE class "NEW" RETURNING variableo
MOVE class::"NEW" TO variable
Cobravariable «as class» = class(parameters)variable.dispose
ISLISP(setq variable (create (class <some-class> [:field-1 value-1 [:field-2 value-2] ..])))[3]

Declaración de clase

claseprotocoloespacio de nombres
Objetos ABAPclass name definition «inheriting from parentclass». «interfaces: interfaces.» method_and_field_declarations endclass.
class name implementation. method_implementations endclass.
interface name. members endinterface.
APL (dialog):Class name «:parentclass» «,interfaces»
members
:EndClass
:Interface name
members
:EndInterface
:Namespace name
members
:EndNamespace
C++class name« : public parentclasses[7]» { members };namespace name { members }
DO#class name« : «parentclass»«, interfaces»» { members }interface name« : parentinterfaces» { members }
Dmodule name;
members
CEclass name« : base class» { «default member values assignments» «members» }namespace name;
Javaclass name« extends parentclass»« implements interfaces» { members }interface name« extends parentinterfaces» { members }package name; members
PHPnamespace name; members
Objetivo-C@interface name« : parentclass»[8] [9]«< protocols >» { instance_fields } method_and_property_declarations @end
@implementation
name method_implementations @end
@protocol name«< parentprotocols >» members @end[10]
Rápidoclass name« : «parentclass»«, protocols»» { members }protocol name« : parentprotocols» { members }
Pitónclass name«(parentclasses[7])»:
Tab ↹
members
[11]__all__ = [ member1,member2,... ]
Visual Basic .NETClass name« Inherits parentclass»« Implements interfaces»
members
End Class
Interface name« Inherits parentinterfaces»
members
End Interface
Namespace name
members
End Namespace
XojoClass name« Inherits parentclass»« Implements interfaces»
members
End Class
Interface name« Inherits parentinterfaces»
members
End Interface
Module name
members
End Module
Torre Eiffelclass name« inherit parentclasses[7]»
members
end
Perlpackage name; «@ISA = qw(parentclasses[7]);» members 1;package name; members
Rakuclass name «is parentclass «is parentclass ...[7]»» «does role «does role ...»» { members }role name «does role «does role ...»» { members }module name { members }
Rubíclass name« < parentclass»
members
end
module name
members
end
Windows PowerShell
OCamlclass name «parameters» = object «(self)» «inherit parentclass «parameters» «inherit parentclass «parameters» ...[7]»» members endmodule name
members
F#type name«(parameters)» «as this» = class «inherit parentclass«(parameters)» «as base»» members «interface interface with implementation «interface interface with implementation ...»» endtype name = interface members endnamespace name
members
Charla informal[12][13]
JavaScript (ES6)class name «extends parentclass» { members }
Objeto 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
Escala
clase ConcreteClass ( params del constructor ) extiende ParentClass con Trait1 con Trait2 con Trait2 { // miembros }         
rasgo TraitName extiende OtherTrait1 con OtherTrait2 con OtherTrait3 { // miembros }      
nombre del paquete 
COBOLCLASS-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.

Cobraclass name «inherits parentclass» «implements interfaces»
Tab ↹ members
interface name «inherits parentinterfaces»
Tab ↹ members
namespace name
Tab ↹ members
ISLISP(defclass name (base-class) ((x :initform 0 :accessor get-x :initarg x)) (:abstractp nil))

Miembros de la clase

Constructores y destructores

constructorincinerador de basurasfinalizador [14]
Objetos ABAPmethods constructor «importing parameter = argument»
method constructor. instructions endmethod.
[15]
APL (dialog) name
:Implements Constructor «:Base «expr»»
instructions
name
:Implements Destructor
instructions
C++class(«parameters») «: initializers[16]» { instructions }~class() { instructions }
DO#class(«parameters») { instructions }void Dispose(){ instructions }~class() { instructions }
Dthis(«parameters») { instructions }~this() { instructions }
CEclass() { instructions }~class() { instructions }
Javaclass(«parameters») { instructions }void finalize() { instructions }
Torre Eiffel[17][18]
Objetivo-C (Cacao)- (id)init { instructions... return self; } or
- (id)initWithFoo:parameter «bar:parameter ...» { instructions... return self; }
- (void)dealloc { instructions }- (void)finalize { instructions }
Rápidoinit(«parameters») { instructions }deinit { instructions }
Pitóndef __init__(self«, parameters»):
Tab ↹ instructions
def __del__(self):
Tab ↹ instructions
Visual Basic .NETSub New(«parameters»)
instructions
End Sub
Sub Dispose()
instructions
End Sub
Overrides Sub Finalize()
instructions
End Sub
XojoSub Constructor(«parameters»)
instructions
End Sub
Sub Destructor()
instructions
End Sub
PHPfunction __construct(«parameters») { instructions }function __destruct() { instructions }
Perlsub new { my ($class«, parameters») = @_; my $self = {}; instructions ... bless($self, $class); return $self; }sub DESTROY { my ($self) = @_; instructions }
Rakusubmethod BUILD { instructions } or
«multi » method new(««$self: »parameters») { self.bless(*, field1 => value1, ...); ... instructions }
submethod DESTROY { instructions }
Rubídef initialize«(parameters)»
instructions
end
Windows PowerShell
OCamlinitializer instructions[19]
F#do instructions or
new(parameters) = expression
[20]
member this.Dispose() = instructionsoverride this.Finalize() = instructions
JavaScriptfunction name(«parameters») { instructions }[21]
JavaScript (ES6)constructor(«parameters») { instructions }
COBOL[22]
Cobracue init(parameters)
Tab ↹ base.init
Tab ↹ instructions
def dispose
Tab ↹ instructions
ISLISP(defmethod initialize-object ((instance <class-name>) initvalues)

Campos

públicoprivadoprotegidoamigo
Objetos ABAPpublic section.[23] data field type type.private section.[23] data field type type.protected section.[23] data field type type.[24]
APL (dialog):Field Public field « value»:Field «Private» field « value»
C++public: type field;private: type field;protected: type field;[25]
DO#public type field «= value»;private type field «= value»;protected type field «= value»;internal type field «= value»;
Dpackage type field «= value»;
Javaprotected type field «= value»;type field «= value»;
CEpublic type field;private type field;
Torre Eiffelfeature
field: TYPE
feature {NONE}
field: TYPE
feature {current_class}
field: TYPE
feature {FRIEND}
field: TYPE
Objetivo-C@public type field;@private type field;@protected type field;@package type field;
Rápido
Charla informal[26]
Pitónself.field = value[27][28]
Visual Basic .NETPublic field As type «= value»Private field As type «= value»Protected field As type «= value»Friend field As type «= value»
XojoPublic field As type «= value»Private field As type «= value»Protected field As type «= value»
PHPpublic $field «= value»;private $field «= value»;protected $field «= value»;
Perl$self->{field} = value;[27]
Rakuhas« type »$.field« is rw»has« type »$!field
Rubí@field = value[27]
Windows PowerShellAdd-Member
«-MemberType »NoteProperty
«-Name »Bar «-Value »value
-InputObject variable
OCamlval «mutable» field = value
F#let «mutable» field = value
JavaScriptthis.field = value
this["field"] = value
[27]
COBOLcláusulas de campo de número de nivel . [29]
Cobravar field «as type» «= value»var __field «as type» «= value»var _field «as type» «= value»
ISLISP(field :initform value :accessor accessor-name :initarg keyword)

Métodos

método básico/vacíométodo de retorno de valor
Objetos ABAPmethods name «importing parameter = argument» «exporting parameter = argument» «changing parameter = argument» «returning value(parameter)»
method name. instructions endmethod.
[30]
[31]
APL (dialog) «left argument» name «right arguments»
instructions
result «left argument» name «right arguments»
instructions
C++ [32]
type foo(«parameters»);

La implementación de métodos generalmente se proporciona en un archivo fuente separado, con la siguiente sintaxis

type class::foo(«parameters») { instructions }[33]
void foo(«parameters») { instructions }type foo(«parameters») { instructions ... return value; }
DO#
D
Java
CEvoid ««type of 'this'»::»foo(«parameters») { instructions }type ««type of this»::»foo(«parameters») { instructions ... return value; }
Torre Eiffelfoo ( «parameters» )
do
instructions
end
foo ( «parameters» ): TYPE
do
instructions...
Result := value
end
Objetivo-C- (void)foo«:parameter «bar:parameter ...»» { instructions }- (type)foo«:parameter «bar:parameter ...»» { instructions... return value; }
Rápidofunc foo(«parameters») { instructions }func foo(«parameters») -> type { instructions... return value }
Pitóndef foo(self«, parameters»):
Tab ↹
instructions
def foo(self«, parameters»):
Tab ↹
instructions
Tab ↹ return
value
Visual Basic .NETSub Foo(«parameters»)
instructions
End Sub
Function Foo(«parameters») As type
instructions
...
Return value
End Function
XojoSub Foo(«parameters»)
instructions
End Sub
Function Foo(«parameters») As type
instructions
...
Return value
End Function
PHPfunction foo(«parameters»)«: void» { instructions }function foo(«parameters»)«: type» { instructions ... return value; }
Perlsub foo { my ($self«, parameters») = @_; instructions }sub foo { my ($self«, parameters») = @_; instructions ... return value; }
Raku«has »«multi »method foo(««$self: »parameters») { instructions }«has «type »»«multi »method foo(««$self: »parameters») { instructions ... return value; }
Rubídef foo«(parameters)»
instructions
end
def foo«(parameters)»
instructions
expression resulting in return value
end
or
def foo«(parameters
instructions
return value
end
Windows PowerShellAdd-Member «-MemberType» ScriptMethod «-Name» foo «-Value» { «param(parameters)» instructions } -InputObject variableAdd-Member «-MemberType» ScriptMethod «-Name» foo «-Value» { «param(parameters)» instructions ... return value } -InputObject variable
OCamlmethod foo «parameters» = expression
F#member this.foo(«parameters») = expression
JavaScriptthis.method = function(«parameters») {instructions}
name«.prototype.method = function(«parameters») {instructions}
[34]
this.method = function(«parameters») {instructions... return value;}
name«.prototype.method = function(«parameters») {instructions... return value;}
[34]
Javascript (ES6)foo(«parameters») {instructions}foo(«parameters») {instructions... return value;}
COBOLMETHOD-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.

Cobradef foo(parameters)
Tab ↹ instructions
def foo(parameters) as type
Tab ↹ instructions
Tab ↹ return value
ISLISP(defgeneric method (arg1 arg2))
(defmethod method ((arg1 <class1> arg2 <class2>) ...)

Propiedades

Cómo declarar una propiedad denominada "Bar"

Implementado manualmente

lectura-escrituraSólo lecturaSólo escritura
Objetos ABAP
APL (dialog):Property Bar
result ← Get
instructions

∇ Set arguments
instructions

:EndProperty Bar
:Property Bar
result ← Get
instructions

:EndProperty Bar
:Property Bar
∇ Set arguments
instructions

:EndProperty Bar
C++
DO#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; }
CEproperty type Bar {
get {
instructions ... return value; }
set {
instructions } }
property type Bar { get { instructions ... return value; } }property type Bar { set { instructions } }
Java
Objective-C 2.0 (Cacao)@property (readwrite) type bar;
Y luego dentro
@implementation
- (type)bar { instructions }
- (void)setBar:(type)value { instructions }
@property (readonly) type bar;
Y luego dentro
@implementation
- (type)bar { instructions }
Rápidovar bar : type { get { instructions } set«(newBar)» { instructions } }var bar : type { instructions }
Torre Eiffelfeature -- Access
x: TYPE assign set_x
feature -- Settings
set_x (a_x: like x) do instructions ensure x_set: verification end
Pitóndef setBar(self, value):
Tab ↹ instructions
def
getBar(self):
Tab ↹
instructions
Tab ↹ return value
bar = property(getBar, setBar)
[35]
def getBar(self):
Tab ↹ instructions
Tab ↹ return value
bar = property(getBar)
def setBar(self, value):
Tab ↹ instructions
bar = property(fset = setBar)
Visual Basic .NETProperty 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
XojoComputedProperty 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
PHPfunction __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
} }
Perlsub 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";
}
}
Raku
Rubí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 PowerShellAdd-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) = expressionmember this.Bar = expressionmember 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 }
COBOLMETHOD-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.

Cobrapro bar «as type»
Tab ↹ get
Tab ↹Tab ↹ instructions
Tab ↹Tab ↹ return value
Tab ↹ set
Tab ↹Tab ↹ instructions
get bar «as type»
Tab ↹ instructions
Tab ↹ return value
set bar «as type»
Tab ↹ instructions
ISLISP

Implementado automáticamente

lectura-escrituraSólo lecturaSólo escritura
Objetos ABAP
C++
DO#type Bar { get; set; }type Bar { get; private set; }type Bar { private get; set; }
D
Java
Objective-C 2.0 (Cacao)@property (readwrite) type bar;
Y luego dentro@implementation
@synthesize bar;
@property (readonly) type bar;
Y luego dentro@implementation
@synthesize bar;
Rápidovar bar : typelet bar : type
Torre Eiffel
Pitón@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 .NETProperty Bar As type« = initial_value» (VB 10)
PHP
Perla [36]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');
Raku
Rubíattr_accessor :barattr_reader :barattr_writer :bar
Windows PowerShell
OCaml
F#member val Bar = value with get, set
COBOLlevel-number bar clauses PROPERTY.level-number bar clauses PROPERTY «WITH» NO SET.level-number bar clauses PROPERTY «WITH» NO GET.
Cobrapro bar from var «as type»get bar from var «as type»set bar from var «as type»

Operadores sobrecargados

Operadores estándar

unariobinariollamada de función
Objetos ABAP
C++type operator symbol () { instructions }type operator symbol (type operand2) { instructions }type operator () («parameters») { instructions }
DO#static type operator symbol(type operand) { instructions }static type operator symbol(type operand1, type operand2) { instructions }
Dtype 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
Objetivo-C
Rápidofunc symbol(operand1 : type) -> returntype { instructions }(fuera de clase)func symbol(operand1 : type1, operand2 : type2) -> returntype { instructions }(fuera de clase)
Eiffel [37]op_name alias "symbol": TYPE
do instructions end
op_name alias "symbol" (operand: TYPE1): TYPE2
do instructions end
Pitóndef __opname__(self):
Tab ↹
instructions
Tab ↹ return
value
def __opname__(self, operand2):
Tab ↹
instructions
Tab ↹ return
value
def __call__(self«, parameters»):
Tab ↹
instructions
Tab ↹ return
value
Visual Basic .NETShared Operator symbol(operand As type) As type
instructions
End Operator
Shared Operator symbol(operand1 As type, operand2 As type) As type
instructions
End Operator
XojoFunction Operator_name(operand As type) As type
instructions
End Function
PHP[38]function __invoke(«parameters») { instructions } (PHP 5.3+)
Perluse 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 }
Rubí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 = expressionstatic member (symbol) (operand1, operand2) = expression
COBOL
ISLISP

Indexadores

lectura-escrituraSólo lecturaSólo escritura
Objetos ABAP
APL (dialog):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
C++type& operator[](type index) { instructions }type operator[](type index) { instructions }
DO#type this[type index] {
get{
instructions }
set{
instructions } }
type this[type index] { get{ instructions } }type this[type index] { set{ instructions } }
Dtype 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 (compilador reciente de Clang)- (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 }
Rápidosubscript (index : type) -> returntype { get { instructions } set«(newIndex)» { instructions } }subscript (index : type) -> returntype { instructions }
Eiffel [37]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
Pitóndef __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 .NETDefault 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[39]
Perl[40]
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; }
Rubí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 = expressionmember this.Item with get(index) = expressionmember this.Item with set index value = expression
COBOL
Cobrapro[index «as type»] as type
Tab ↹ get
Tab ↹Tab ↹ instructions
Tab ↹Tab ↹ return value
Tab ↹ set
Tab ↹Tab ↹ instructions
get[index «as type»] as type
Tab ↹ instructions
Tab ↹ return value
set[index «as type»] as type
Tab ↹ instructions

Tipos de yeso

alicaídosubida de tono
Objetos ABAP
C++operator returntype() { instructions }
DO#static explicit operator returntype(type operand) { instructions }static implicit operator returntype(type operand) { instructions }
DT opCast(T)() if (is(T == type)) { instructions }
CEproperty T { get { return «conversion code»; } }
Java
Objetivo-C
Eiffel [37]
Pitón
Visual Basic .NETShared Narrowing Operator CType(operand As type) As returntype
instructions
End Operator
Shared Widening Operator CType(operand As type) As returntype
instructions
End Operator
PHP
Perl
Rakumulti method type«($self:)» is export { instructions }
Rubí
Windows PowerShell
OCaml
F#
COBOL

Acceso de miembros

Cómo acceder a los miembros de un objeto x

miembro del objetomiembro de la clasemiembro del espacio de nombres
métodocampopropiedad
Objetos ABAPx->methodparameters»).[41]x->fieldx=>field or x=>methodparameters[41]»).
C++x.method(parameters) or
ptr->method(parameters)
x.field or
ptr->field
cls::memberns::member
Objetivo-C[x method«:parameter «bar:parameter ...»»]x->fieldx.property (2.0 only) or
[x property]
[cls method«:parameter «bar:parameter ...»»]
Charla informalx method«:parameter «bar:parameter ...»»cls method«:parameter «bar:parameter ...»»
Rápidox.method(parameters)x.propertycls.member
APL (dialog)left argument» x.method «right argument(s)»x.fieldx.propertycls.memberns.member
DO#x.method(parameters)
Java
Dx.property
Pitón
Visual Basic .NET
Xojo
Windows PowerShell[cls]::member
F#cls.member
CEx.method«(parameters)»x.fieldx.propertycls::memberns::member
Torre Eiffelx.method«(parameters)»x.field{cls}.member
Rubíx.propertycls.member
PHPx->method(parameters)x->fieldx->propertycls::memberns\member
Perlx->method«(parameters)»x->{field}cls->method«(parameters)»ns::member
Rakux.method«(parameters)» or
x!method«(parameters)»
x.field or
x!field
cls.method«(parameters)» or
cls!method«(parameters)»
ns::member
OCamlx#method «parameters»
JavaScriptx.method(parameters)
x["method"](parameters)
x.field
x["field"]
x.property
x["property"]
cls.member
cls["member"]
COBOLINVOKE x "method" «USING parameters» «RETURNING result» or
x::"method"«(«parameters»)»
property OF xINVOKE cls "method" «USING parameters» «RETURNING result» or
cls::"method"«(«parameters»)» or
property OF cls
Cobrax.method«(parameters)»x.fieldx.propertycls.memberns.member

Disponibilidad de miembros

¿Tiene miembro?Controlador de miembros faltantes
MétodoCampoMétodoCampo
APL (dialog)3=x.⎕NC'method'2=x.⎕NC'method'
Objetos ABAP
C++
Objetivo-C (Cacao)[x respondsToSelector:@selector(method)]forwardInvocation:
Charla informalx respondsTo: selectordoesNotUnderstand:
DO#(usando la reflexión)
CE
Java
DopDispatch()
Torre Eiffel
Pitónhasattr(x, "method") and callable(x.method)hasattr(x, "field")__getattr__()
Visual Basic .NET(usando la reflexión)
Xojo(usando introspección)
Windows PowerShell(usando la reflexión)
F#(usando la reflexión)
Rubíx.respond_to?(:method)method_missing()
PHPmethod_exists(x, "method")property_exists(x, "field")__call()__get() / __set()
Perlx->can("method")exists x->{field}CARGA AUTOMÁTICA
Rakux.can("method")x.field.definedCARGA AUTOMÁTICA
OCaml
JavaScripttypeof x.method === "function"field in x
COBOL

Variables especiales

objeto actualobjeto padre del objeto actualreferencia nulaContexto actual de ejecución
Charla informalselfsupernilthisContext
Objetos ABAPmesuperinitial
APL (dialog)⎕THIS⎕BASE⎕NULL
C++*this[42]NULL, nullptr
DO#thisbase[43]null
Javasuper[43]
D
JavaScriptsuper[43] (ECMAScript 6)null, undefined[44]
CEthisnull
Objetivo-Cselfsuper[43]nil
Rápidoselfsuper[43]nil[45]
Pitónself[46]super(current_class_name, self)[7]
super() (solo 3.x)
None
Visual Basic .NETMeMyBaseNothing
XojoMe / SelfParentNil
Torre EiffelCurrentPrecursor «{superclass}» «(args)»[43] [47]Void
PHP$thisparent[43]null
Perl$self[46]$self->SUPER[43]undef
RakuselfSUPERNil
Rubíselfsuper«(args)»[48]nilbinding
Windows PowerShell$this$NULL
OCamlself[49]super[50][51]
F#thisbase[43]null
COBOLSELFSUPERNULL
Cobrathisbasenil

Métodos especiales

Representación de cadenasCopia de objetoIgualdad de valoresComparación de objetosCódigo hashIdentificación del objeto
Legible para humanosCompatible con la fuente
Objetos ABAP
APL (dialog)x⎕SRC x⎕NS xx = y
C++x == y[52]El puntero al objeto se puede convertir en un identificador entero.
DO#x.ToString()x.Clone()x.Equals(y)x.CompareTo(y)x.GetHashCode()System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(x)
Javax.toString()x.clone()[53]x.equals(y)x.compareTo(y)[54]x.hashCode()System.identityHashCode(x)
JavaScriptx.toString()
Dx.toString() or
std.conv.to!string(x)
x.stringofx == y or
x.opEquals(y)
x.opCmp(y)x.toHash()
CEx.OnGetString(tempString, null, null) or
PrintString(x)
y.OnCopy(x)x.OnCompare(y)El identificador del objeto se puede convertir en un identificador entero
Objetivo-C (Cacao)x.descriptionx.debugDescription[x copy][55][x isEqual:y][x compare:y][56]x.hashEl puntero al objeto se puede convertir en un identificador entero.
Rápidox.description[57]x.debugDescription[58]x == y[59]x < y[60]x.hashValue[61]reflect(x).objectIdentifier!.uintValue()
Charla informalx displayStringx printStringx copyx = yx hashx identityHash
Pitónstr(x)[62]repr(x)[63]copy.copy(x)[64]x == y[65]cmp(x, y)[66]hash(x)[67]id(x)
Visual Basic .NETx.ToString()x.Clone()x.Equals(y)x.CompareTo(y)x.GetHashCode()
Torre Eiffelx.outx.twinx.is_equal(y)Cuando x es COMPARABLE, uno puede simplemente hacerx < yCuando x es HASHABLE, se puede utilizarx.hash_codeCuando x es IDENTIFIED, se puede utilizarx.object_id
PHP$x->__toString()clone x[68]x == yspl_object_hash(x)
Perl"$x"[69]Data::Dumper->Dump([$x],['x'])[70]Storable::dclone($x)[71]Scalar::Util::refaddr( $x )[72]
Raku~x[69]x.perlx.clonex eqv yx cmp yx.WHICH
Rubíx.to_sx.inspectx.dup or
x.clone
x == y or
x.eql?(y)
x <=> yx.hashx.object_id
Windows PowerShellx.ToString()x.Clone()x.Equals(y)x.CompareTo(y)x.GetHashCode()
OCamlOo.copy xx = yHashtbl.hash xOo.id x
F#string x or x.ToString() or sprintf "%O" xsprintf "%A" xx.Clone()x = y or x.Equals(y)compare x y or x.CompareTo(y)hash x or x.GetHashCode()
COBOL

Manipulación de tipos

Obtener el tipo de objetoEs una instancia de (incluye subtipos)Transmisión ascendenteAbatido
Comprobación del tiempo de ejecuciónSin cheque
Objetos ABAP[73]=?=
C++typeid(x)dynamic_cast<type *>(&x) != nullptr[74]dynamic_cast<type*>(ptr)(type*) ptr or
static_cast<type*>(ptr)
DO#x.GetType()x is type(type) x or x as type
Dtypeid(x)cast(type) x
Delfosx is typex as type
CEx._classeClass_IsDerived(x._class, type)(type) x
Javax.getClass()x instanceof class(type) x
Objetivo-C (Cacao)[x class][75][x isKindOfClass:[class class]](type*) x
Rápidox.dynamicTypex is typex as! type
x as? type
JavaScriptx.constructor (If not rewritten.)x instanceof class[76]
Visual Basic .NETx.GetType()TypeOf x Is type[74]CType(x, type) or TryCast(x, type)
XojoIntrospection.GetType(x)x IsA typeCType(x, type)
Torre Eiffelx.generating_typeattached {TYPE} xattached {TYPE} x as down_x
Pitóntype(x)isinstance(x, type)[76]
PHPget_class(x)x instanceof class
Perlref(x)x->isa("class")
Rakux.WHATx.isa(class)[74]type(x) or
x.type
Rubíx.classx.instance_of?(type) or
x.kind_of?(type)
[76]
Charla informalx classx isKindOf: class
Windows PowerShellx.GetType()x -is [type][74][type]x or x -as [type]
OCaml[77](x :> type)
F#x.GetType()x :? type(x :?> type)
COBOLx AS type[74]

Gestión de espacios de nombres

Importar espacio de nombresImportar artículo
calificadono cualificado
Objetos ABAP
C++using namespace ns;using ns::item ;
DO#using ns;using item = ns.item;
Dimport ns;import ns : item;
Javaimport ns.*;import ns.item;
Objetivo-C
Visual Basic .NETImports ns
Torre Eiffel
Pitónimport nsfrom ns import *from ns import item
PHPuse ns;use ns\item;
Perluse ns;use ns qw(item);
Raku
Rubí
Windows PowerShell
OCamlopen ns
F#
COBOL

Contratos

Condición previaPostcondiciónControlarInvarianteBucle
Objetos ABAP
C++
DO#Spec#:
type foo( «parameters» )
    requires expression
{
    body
}
Spec#:
type foo( «parameters» )
    ensures expression
{
    body
}
Java
Objetivo-C
Visual Basic .NET
Df
in { asserts }
body{
instructions }
f
out (result) { asserts }
body{
instructions }
assert(expression)invariant() { expression }
Torre Eiffelf
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
Pitón
PHP
Perl
RakuPRE { condition }POST { condition }
Rubí
Windows PowerShell
OCaml
F#
COBOL

Véase también

Referencias y notas

  1. ^ parámetro = el argumento puede repetirse si el constructor tiene varios parámetros
  2. ^ SAP se reservó el uso de la destrucción.
  3. ^ abcdefghijkl Este lenguaje utiliza la recolección de basura para liberar memoria no utilizada.
  4. ^ Esta sintaxis crea un valor de objeto con duración de almacenamiento automática
  5. ^ Esta sintaxis crea un objeto con duración de almacenamiento dinámica y devuelve un puntero a él.
  6. ^ Los objetos OCaml se pueden crear directamente sin pasar por una clase.
  7. ^ abcdefg Este lenguaje admite herencia múltiple . Una clase puede tener más de una clase padre.
  8. ^ Si no se proporciona una clase padre, la clase se convierte en una clase raíz. En la práctica, esto casi nunca se hace. En general, se debe utilizar la clase base convencional del marco que se esté utilizando, que es NSObjectpara Cocoa y GNUstep, o Objectcualquier otro.
  9. ^ Por lo general, la @interfaceparte se coloca en un archivo de encabezado y la @interfaceparte se coloca en un archivo de código fuente separado.
  10. ^ Prefijos de nombres de clases y protocolos utilizados convencionalmente como una especie de espacio de nombres
  11. ^ En Python, las interfaces son clases cuyos métodos tienen como cuerpo pases .
  12. ^ La clase es un objeto.
    Simplemente envíe un mensaje a la superclase (st-80) o al espacio de nombres de destino (Visualworks).
  13. ^ El espacio de nombres es un objeto.
    Simplemente envíe un mensaje al espacio de nombres principal.
  14. ^ El recolector de basura llama a un finalizador cuando un objeto está a punto de ser recolectado. No hay garantía de cuándo se llamará o si se llamará en absoluto.
  15. ^ En ABAP, el constructor debe definirse como un método (ver comentarios sobre el método) con las siguientes restricciones: el nombre del método debe ser "constructor" y solo se pueden definir parámetros "importadores".
  16. ^ Aquí se incluye una lista opcional separada por comas de inicializadores para objetos miembro y clases padre. La sintaxis para inicializar objetos miembro es
    "member_name(parameters)"
    Esto funciona incluso para miembros primitivos, en cuyo caso se especifica un parámetro y ese valor se copia en el miembro. La sintaxis para inicializar clases padre es
    "class_name(parameters)".
    Si no se especifica un inicializador para una clase miembro o principal, se utiliza el constructor predeterminado .
  17. ^ Cualquier procedimiento de Eiffel puede utilizarse como procedimiento de creación, también conocido como constructor. Véase el párrafo sobre Eiffel en Constructor (informática) .
  18. ^ La implementación de {DISPOSABLE}.dispose garantiza que se llamará a dispose cuando se recolecte basura del objeto.
  19. ^ Esta construcción "inicializadora" rara vez se utiliza. Los campos en OCaml normalmente se inicializan directamente en su declaración. Solo cuando se necesitan operaciones imperativas adicionales se utiliza "inicializador". Los "parámetros del constructor" en otros lenguajes se especifican como parámetros de la clase en OCaml. Consulte la sintaxis de la declaración de clase para obtener más detalles.
  20. ^ Esta sintaxis se utiliza normalmente para sobrecargar constructores.
  21. ^ En JavaScript, el constructor es un objeto.
  22. ^ Los constructores se pueden emular con un método de fábrica que devuelve una instancia de clase.
  23. ^ abc El identificador de alcance debe aparecer una vez en la declaración del archivo, todas las declaraciones de variables después de este identificador de alcance tienen su alcance, hasta que se alcance otro identificador de alcance o el final de la declaración de la clase
  24. ^ En ABAP, los campos o métodos específicos no se declaran como accesibles para elementos externos, sino que las clases externas se declaran como amigas para tener acceso a los campos o métodos de la clase.
  25. ^ En C++, no se declaran campos específicos como accesibles para elementos externos. En cambio, se declaran funciones y clases externas como amigas para tener acceso a los campos de la clase. Consulte la función amiga y la clase amiga para obtener más detalles.
  26. ^ Simplemente envíe un mensaje a la clase
    clase  addInstVarName:  campo . clase  removeInstVarName:  campo .
  27. ^ abcd Simplemente asígnele un valor en un método
  28. ^ Python no tiene campos privados: todos los campos son de acceso público en todo momento. Existe una convención comunitaria para anteponer un guión bajo a los detalles de implementación, pero el lenguaje no lo exige.
  29. ^ Todos los datos de clase son 'privados' porque el estándar COBOL no especifica ninguna forma de acceder a ellos.
  30. ^ La declaración y la implementación de métodos en ABAP son independientes. La declaración de métodos debe usarse dentro de la definición de la clase. El método (sin "s") debe usarse dentro de la implementación de la clase. parámetro = argumento puede repetirse si hay varios parámetros.
  31. ^ En ABAP, el nombre del parámetro de retorno se define explícitamente en la firma del método dentro de la definición de clase.
  32. ^ En C++, la declaración y la implementación de métodos suelen realizarse por separado. Los métodos se declaran en la definición de clase (que suele estar incluida en un archivo de encabezado ) utilizando la sintaxis
  33. ^ Aunque el cuerpo de un método se puede incluir con la declaración dentro de la definición de clase, como se muestra en la tabla aquí, esto es generalmente una mala práctica. Debido a que la definición de clase debe incluirse con cada archivo fuente que utiliza los campos o métodos de la clase, tener código en la definición de clase hace que el código del método se compile con cada archivo fuente, lo que aumenta el tamaño del código. Sin embargo, en algunas circunstancias, es útil incluir el cuerpo de un método con la declaración. Una razón es que el compilador intentará incluir en línea los métodos que están incluidos en la declaración de clase; por lo tanto, si se produce un método muy corto de una línea , puede ser más rápido permitir que un compilador lo incluya en línea, al incluir el cuerpo junto con la declaración. Además, si se produce una clase o método de plantilla , entonces todo el código debe incluirse con la declaración, porque solo con el código se puede instanciar la plantilla.
  34. ^ ab Simplemente asígnele una función en un método
  35. ^ Implementación alternativa:
    def  bar ():  doc  = "  La propiedad bar."  def  fget ( self ) :  return  self._bar def fset ( self , value ): self._bar = value return locals ( ) bar = propiedad ( ** bar ( ))          
  36. ^ estos ejemplos necesitan tener instalado el módulo Class::Accessor
  37. ^ abc Aunque Eiffel no admite la sobrecarga de operadores, puede definir operadores
  38. ^ PHP no admite la sobrecarga de operadores de forma nativa, pero se puede agregar soporte usando el paquete PECL "operator".
  39. ^ La clase debe implementar la interfaz ArrayAccess.
  40. ^ La clase debe sobrecargar '@{}' (desreferencia de matriz) o subclasificar una de Tie::Array o Tie::StdArray para conectar operaciones de matriz
  41. ^ ab En ABAP, los argumentos deben pasarse utilizando esta sintaxis:
    x->method(«exporting parameter = argument» «importing parameter = argument» «changing parameter = argument» «returning value(parameter)»
    parameter = argumentSe puede repetir si hay varios parámetros.
  42. ^ C++ no tiene una palabra clave "super", porque es posible la herencia múltiple y, por lo tanto, puede resultar ambiguo a qué clase base se hace referencia. En cambio, la BaseClassName::membersintaxis se puede utilizar para acceder a un miembro anulado en la clase base especificada. Microsoft Visual C++ proporciona una palabra clave no estándar "__super" para este propósito; pero no es compatible con otros compiladores.[1]
  43. ^ abcdefghi La palabra clave aquí no es un valor y solo se puede usar para acceder a un método de la superclase.
  44. ^ Pero tened miedo, no tienen el mismo valor.
  45. ^ solo para tipos opcionales
  46. ^ ab En este lenguaje, a los métodos de instancia se les pasa el objeto actual como primer parámetro, que convencionalmente se denomina "self", pero no es necesario que así sea.
  47. ^ "Precursor" en Eiffel es en realidad una llamada al método del mismo nombre en la superclase. Por lo tanto, Precursor(args) es equivalente a "super.currentMethodName(args)" en Java. No hay forma de llamar a un método con un nombre diferente en la superclase.
  48. ^ "super" en Ruby, a diferencia de otros lenguajes, es en realidad una llamada al método del mismo nombre en la superclase. Por lo tanto, super(args) en Ruby es equivalente a "super.currentMethodName(args)" en Java. No hay forma de llamar a un método con un nombre diferente en la superclase.
  49. ^ En OCaml, una declaración de objeto puede comenzar opcionalmente con un parámetro que se asociará con el objeto actual. Este parámetro se denomina convencionalmente "self", pero no es obligatorio que sea así. Es una buena práctica colocar un parámetro allí para poder llamar a los métodos propios.
  50. ^ En OCaml, una declaración de herencia ("inherit") puede asociarse opcionalmente con un valor, con la sintaxis " heredar los «parámetros» de la clase padre como super". Aquí "super" es el nombre que se le da a la variable asociada con este objeto padre. Puede tener otros nombres.
  51. ^ Sin embargo, si se necesita la capacidad de tener un valor "opcional" en OCaml, entonces envuelva el valor dentro de un optiontipo, cuyos valores son Noney Some x, que podrían usarse para representar "referencia nula" y "referencia no nula a un objeto" como en otros lenguajes.
  52. ^ Suponiendo que "x" e "y" son los objetos (y no punteros). Se puede personalizar sobrecargando el ==operador del objeto.
  53. ^ Solo se puede acceder desde dentro de la clase, ya que el clone()método heredado de Objectestá protegido, a menos que la clase anule el método y lo haga público. Si se usa el método clone()heredado de Object, la clase debe implementar la Cloneableinterfaz para permitir la clonación.
  54. ^ La clase debe implementar la interfaz Comparablepara que este método esté estandarizado.
  55. ^ Implementado por el copyWithZone:método del objeto
  56. ^ compare: es el nombre convencional para el método de comparación en las clases Foundation. Sin embargo, no existe un protocolo formal
  57. ^ Solo si el objeto cumple con el Printableprotocolo
  58. ^ Solo si el objeto cumple con el DebugPrintableprotocolo
  59. ^ Solo si el objeto cumple con el Equatableprotocolo
  60. ^ Solo si el objeto cumple con el Comparableprotocolo
  61. ^ Solo si el objeto cumple con el hashValueprotocolo
  62. ^ Se puede personalizar mediante el __str__()método del objeto.
  63. ^ Se puede personalizar mediante el __repr__()método del objeto.
  64. ^ Se puede personalizar mediante el __copy__()método del objeto.
  65. ^ Se puede personalizar mediante el __eq__()método del objeto.
  66. ^ Solo en Python 2.x y anteriores (eliminado en Python 3.0). Se puede personalizar mediante el __cmp__()método del objeto
  67. ^ Se puede personalizar mediante el __hash__()método del objeto. No todos los tipos son hasheables (los tipos mutables normalmente no lo son)
  68. ^ Se puede personalizar mediante el __clone()método del objeto.
  69. ^ ab Se puede personalizar sobrecargando el operador de conversión de cadena del objeto
  70. ^ Este ejemplo requiere el uso de Data::Dumper
  71. ^ Este ejemplo requiere el uso de ing Almacenable
  72. ^ Este ejemplo requiere el uso de Scalar::Util
  73. ^ La información de tipo de tiempo de ejecución en ABAP se puede recopilar utilizando diferentes clases de descripción como CL_ABAP_CLASSDESCR.
  74. ^ abcde La conversión ascendente está implícita en este lenguaje. Se puede utilizar una instancia de subtipo donde se necesita un supertipo.
  75. ^ Solo para objetos que no sean de clase. Si xes un objeto de clase, [x class]devuelve solo x. El método de tiempo de ejecución object_getClass(x)devolverá la clase de xpara todos los objetos.
  76. ^ abc Este lenguaje tiene tipado dinámico. No es necesario realizar conversiones entre tipos.
  77. ^ Este lenguaje no proporciona información de tipo en tiempo de ejecución. No es necesario porque tiene tipos estáticos y la conversión descendente es imposible.
Retrieved from "https://en.wikipedia.org/w/index.php?title=Comparison_of_programming_languages_(object-oriented_programming)&oldid=1232098485"