Сравнение языков программирования (объектно-ориентированное программирование)
![]() | Эту статью может потребовать очистки Википедии , чтобы она соответствовала стандартам качества . Конкретная проблема заключается в следующем: этой статьи справочный раздел содержит множество сносок, но не содержит внешних ссылок или источников. ( июнь 2013 г. ) |
В этом сравнении языков программирования сравнивается то, как объектно-ориентированные языки программирования, такие как C++ , Java , Smalltalk , Object Pascal , Perl , Python и другие, манипулируют структурами данных .
Строительство и разрушение объекта [ править ]
строительство | разрушение | |
---|---|---|
ABAP-объекты | data variable type ref to class . [1]
|
[2] [3] |
АПЛ (Диалог) | variable←⎕NEW class «parameters»
|
⎕EX 'variable'
|
С++ | class variable«(parameters)»; [4] или class *variable = new class«(parameters)»; [5]
|
delete pointer;
|
С# | class variable = new class(parameters);
|
variable.Dispose(); [3]
|
Ява | [3] | |
Д | destroy(variable);
| |
ЕС | class «instance handle» { «properties/data members assignments, instance method overrides» }
|
delete instance handle;
|
Цель-C ( Какао ) | class *variable = [[class alloc ] init]; или class *variable = [[class alloc ] initWithFoo:parameter «bar:parameter ...»];
|
[variable release];
|
Быстрый | let variable = class(parameters)
|
|
Питон | variable = class(parameters)
|
del variable [3] (Обычно не требуется)
|
Визуальный Бейсик .NET | Dim variable As New class(parameters)
|
variable.Dispose() [3]
|
Хохо | Dim variable As New class(parameters)
|
variable = Nil
|
Эйфелева | create variable или create «{TYPE}» variable.make_foo «(parameters)» или variable := create {TYPE} или variable := create {TYPE}.make_foo «(parameters)»
|
[3] |
PHP | $variable = new class«(parameters)»;
|
unset($variable); [3]
|
Перл 5 | «my »$variable = class->new«(parameters)»;
|
undef($variable);
|
Раку | «my »$variable = class.new«(parameters)»;
|
$variable.undefine;
|
Руби | variable = class.new«(parameters)»
|
[3] |
Windows PowerShell | $variable = New-Object «-TypeName» class ««-ArgumentList» parameters»
|
Remove-Variable «-Name» variable
|
OCaml | let variable = new class «parameters» или let variable = object members end [6]
|
[3] |
Ф# | let variable = «new »class(«parameters»)
| |
Смолток | Класс является объектом. Просто отправьте сообщение классу, обычно #new или #new: и многие другие, например:
Point x: 10 y: 20.
Array with: -1 with: 3 with: 2.
|
|
JavaScript | var variable = new class«(parameters)» или var variable = { «key1: value1«, key2: value2 ...»»}
|
[3] |
Объектный Паскаль ( Делфи ) | ClassVar := ClassType.ConstructorName(parameters);
|
ClassVar.Free;
|
Скала | 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] |
КОБОЛ | INVOKE class "NEW" RETURNING variable или MOVE class::"NEW" TO variable
|
|
Кобра | variable «as class» = class(parameters)
|
variable.dispose
|
ИСЛИСП | (setq variable (create (class <some-class> [:field-1 value-1 [:field-2 value-2] ..])))
|
[3] |
Объявление класса [ править ]
сорт | протокол | пространство имен | |
---|---|---|---|
ABAP-объекты | class name definition «inheriting from parentclass». «interfaces: interfaces.» method_and_field_declarations endclass.
|
interface name. members endinterface.
|
— |
АПЛ (Диалог) | :Class name «:parentclass» «,interfaces» members :EndClass
|
:Interface name members :EndInterface
|
:Namespace name members :EndNamespace
|
С++ | class name« : public parentclasses [7] » { members };
|
namespace name { members }
| |
С# | class name« : «parentclass»«, interfaces»» { members }
|
interface name« : parentinterfaces» { members }
| |
Д | module name;
| ||
ЕС | class name« : base class» { «default member values assignments» «members» }
|
|
namespace name;
|
Ява | class name« extends parentclass»« implements interfaces» { members }
|
interface name« extends parentinterfaces» { members }
|
package name; members
|
PHP | namespace name; members
| ||
Цель-C | @interface name« : parentclass» [8] «< protocols >» { instance_fields } method_and_property_declarations @end [9]
|
@protocol name«< parentprotocols >» members @end
|
[10] |
Быстрый | class name« : «parentclass»«, protocols»» { members }
|
protocol name« : parentprotocols» { members }
|
|
Питон | class name«(parentclasses[7])»:
|
[11] | __all__ = [ member1,member2,... ]
|
Визуальный Бейсик .NET | Class name« Inherits parentclass»« Implements interfaces»
|
Interface name« Inherits parentinterfaces»
|
Namespace name
|
Хохо | Class name« Inherits parentclass»« Implements interfaces»
|
Interface name« Inherits parentinterfaces»
|
Module name
|
Эйфелева | class name« inherit parentclasses[7]»
|
— | |
Перл | package name; «@ISA = qw(parentclasses[7]);» members 1;
|
package name; members
| |
Раку | class name «is parentclass «is parentclass ...[7]»» «does role «does role ...»» { members }
|
role name «does role «does role ...»» { members }
|
module name { members }
|
Руби | class name« < parentclass»
|
module name
| |
Windows PowerShell | — | ||
OCaml | class name «parameters» = object «(self)» «inherit parentclass «parameters» «inherit parentclass «parameters» ...[7]»» members end
|
module name
| |
Ф# | 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
|
Смолток | [12] | [13] | |
JavaScript (ES6) | class name «extends parentclass» { members }
|
||
Объектный Паскаль (Делфи) |
|
package name; members
| |
Скала | class ConcreteClass(constructor params)
extends ParentClass
with Trait1 with Trait2 with Trait2 {
// members
}
|
trait TraitName
extends OtherTrait1
with OtherTrait2 with OtherTrait3 {
// members
}
|
package name
|
КОБОЛ | CLASS-ID. name« INHERITS« FROM» parentclasses».
FACTORY« IMPLEMENTS interfaces». class-members END FACTORY. OBJECT« IMPLEMENTS interfaces». instance-members END OBJECT.
|
INTERFACE-ID. name« INHERITS« FROM» interfaces».
members
|
— |
Кобра | class name «inherits parentclass» «implements interfaces»
|
interface name «inherits parentinterfaces»
|
namespace name
|
ИСЛИСП | (defclass name (base-class) ((x :initform 0 :accessor get-x :initarg x)) (:abstractp nil))
|
Члены класса [ править ]
Конструкторы и деструкторы [ править ]
конструктор | деструктор | финализатор [14] | |
---|---|---|---|
ABAP-объекты | methods constructor «importing parameter = argument» [15]
|
— | |
АПЛ (Диалог) | ∇ name :Implements Constructor «:Base «expr»» instructions ∇
|
∇ name :Implements Destructor instructions ∇
| |
С++ | class(«parameters») «: initializers [16] » { instructions }
|
~class() { instructions }
|
|
С# | class(«parameters») { instructions }
|
void Dispose(){ instructions }
|
~class() { instructions }
|
Д | this(«parameters») { instructions }
|
~this() { instructions }
| |
ЕС | class() { instructions }
|
~class() { instructions }
|
|
Ява | class(«parameters») { instructions }
|
void finalize() { instructions }
| |
Эйфелева | [17] | [18] | |
Цель-C (Какао) | - (id)init { instructions... return self; } or
|
- (void)dealloc { instructions }
|
- (void)finalize { instructions }
|
Быстрый | init(«parameters») { instructions }
|
deinit { instructions }
|
|
Питон | def __init__(self«, parameters»):
|
def __del__(self):
| |
Визуальный Бейсик .NET | Sub New(«parameters»)
|
Sub Dispose()
|
Overrides Sub Finalize()
|
Хохо | Sub Constructor(«parameters»)
|
Sub Destructor()
|
|
PHP | function __construct(«parameters») { instructions }
|
function __destruct() { instructions }
|
|
Перл | sub new { my ($class«, parameters») = @_; my $self = {}; instructions ... bless($self, $class); return $self; }
|
sub DESTROY { my ($self) = @_; instructions }
|
|
Раку | submethod BUILD { instructions } or
|
submethod DESTROY { instructions }
|
|
Руби | def initialize«(parameters)»
|
— | |
Windows PowerShell | — | ||
OCaml | initializer instructions [19]
|
— | |
Ф# | do instructions or [20]
|
member this.Dispose() = instructions
|
override this.Finalize() = instructions
|
JavaScript | function name(«parameters») { instructions } [21]
|
— | |
JavaScript (ES6) | constructor( «parameters») { instructions }
| ||
КОБОЛ | — [22] | — | |
Кобра | cue init(parameters)
|
def dispose
|
|
ИСЛИСП | (defmethod initialize-object ((instance <class-name>) initvalues)
|
Поля [ править ]
общественный | частный | защищенный | друг | |
---|---|---|---|---|
ABAP-объекты | public section.[23] data field type type.
|
private section.[23] data field type type.
|
protected section.[23] data field type type.
|
[24] |
АПЛ (Диалог) | :Field Public field «← value»
|
:Field «Private» field «← value»
|
||
С++ | public: type field;
|
private: type field;
|
protected: type field;
|
[25] |
С# | public type field «= value»;
|
private type field «= value»;
|
protected type field «= value»;
|
internal type field «= value»;
|
Д | package type field «= value»;
| |||
Ява | protected type field «= value»;
|
type field «= value»;
| ||
ЕС | public type field;
|
private type field;
| ||
Эйфелева | feature
|
feature {NONE}
|
feature {current_class}
|
feature {FRIEND}
|
Цель-C | @public type field;
|
@private type field;
|
@protected type field;
|
@package type field;
|
Быстрый | — | |||
Смолток | — | [26] | — | |
Питон | self.field = value [27]
|
— [28] | — | |
Визуальный Бейсик .NET | Public field As type «= value»
|
Private field As type «= value»
|
Protected field As type «= value»
|
Friend field As type «= value»
|
Хохо | 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»;
|
|
Перл | $self->{field} = value; [27]
|
— | ||
Раку | has« type »$.field« is rw»
|
has« type »$!field
|
— | |
Руби | — | @field = value [27]
|
||
Windows PowerShell | Add-Member
|
— | ||
OCaml | — | val «mutable» field = value
|
— | |
Ф# | — | let «mutable» field = value
|
— | |
JavaScript | this.field = value [27]
|
|||
КОБОЛ | — | Предложения поля номера уровня . [29] | — | — |
Кобра | var field «as type» «= value»
|
var __field «as type» «= value»
|
var _field «as type» «= value»
|
|
ИСЛИСП | (field :initform value :accessor accessor-name :initarg keyword)
|
Методы [ править ]
основной/пустой метод | метод возврата стоимости | ||
---|---|---|---|
ABAP-объекты | methods name «importing parameter = argument» «exporting parameter = argument» «changing parameter = argument» «returning value(parameter)» [30]
|
[31] | |
АПЛ (Диалог) | ∇ «left argument» name «right arguments» instructions ∇
|
∇ result ← «left argument» name «right arguments» instructions ∇
| |
С++ [32]
Реализация методов обычно предоставляется в отдельном исходном файле со следующим синтаксисом.
|
void foo(«parameters») { instructions }
|
type foo(«parameters») { instructions ... return value; }
| |
С# | |||
Д | |||
Ява | |||
ЕС | void ««type of 'this'»::»foo(«parameters») { instructions }
|
type ««type of this»::»foo(«parameters») { instructions ... return value; }
| |
Эйфелева | foo ( «parameters» )
|
foo ( «parameters» ): TYPE
| |
Цель-C | - (void)foo«:parameter «bar:parameter ...»» { instructions }
|
- (type)foo«:parameter «bar:parameter ...»» { instructions... return value; }
| |
Быстрый | func foo(«parameters») { instructions }
|
func foo(«parameters») -> type { instructions... return value }
| |
Питон | def foo(self«, parameters»):
|
def foo(self«, parameters»):
| |
Визуальный Бейсик .NET | Sub Foo(«parameters»)
|
Function Foo(«parameters») As type
| |
Хохо | Sub Foo(«parameters»)
|
Function Foo(«parameters») As type
| |
PHP | function foo(«parameters»)«: void» { instructions }
|
function foo(«parameters»)«: type» { instructions ... return value; }
| |
Перл | sub foo { my ($self«, parameters») = @_; instructions }
|
sub foo { my ($self«, parameters») = @_; instructions ... return value; }
| |
Раку | «has »«multi »method foo(««$self: »parameters») { instructions }
|
«has «type »»«multi »method foo(««$self: »parameters») { instructions ... return value; }
| |
Руби | def foo«(parameters)»
|
def foo«(parameters)»
| |
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
| |
Ф# | member this.foo(«parameters») = expression
| ||
JavaScript | this.method = function(«parameters») {instructions} [34]
|
this.method = function(«parameters») {instructions... return value;} [34]
| |
Javascript (ES6) | foo(«parameters») {instructions}
|
foo(«parameters») {instructions... return value;}
| |
КОБОЛ | METHOD-ID. foo.
instructions
|
METHOD-ID. foo.
instructions
| |
Кобра | def foo(parameters)
|
def foo(parameters) as type
|
|
ИСЛИСП | (defgeneric method (arg1 arg2))
|
Свойства [ править ]
Как задекларировать недвижимость под названием «Бар»
Вручную реализовано [ править ]
чтение-запись | только для чтения | только для записи | |
---|---|---|---|
ABAP-объекты | — | ||
АПЛ (Диалог) | :Property Bar ∇ result ← Get instructions ∇ ∇ Set arguments instructions ∇ :EndProperty Bar
|
:Property Bar ∇ result ← Get instructions ∇ :EndProperty Bar
|
:Property Bar ∇ Set arguments instructions ∇ :EndProperty Bar
|
С++ | — | ||
С# | type Bar {
|
type Bar { get { instructions ... return value; } }
|
type Bar { set { instructions } }
|
Д | @property type bar() { instructions ... return value; }
|
@property type bar() { instructions ... return value; }
|
@property type bar(type value) { instructions ... return value; }
|
ЕС | property type Bar {
|
property type Bar { get { instructions ... return value; } }
|
property type Bar { set { instructions } }
|
Ява | — | ||
Цель-C 2.0 (Какао) | @property (readwrite) type bar; а затем внутри @implementation
|
@property (readonly) type bar; а затем внутри @implementation
|
— |
Быстрый | var bar : type { get { instructions } set«(newBar)» { instructions } }
|
var bar : type { instructions }
|
— |
Эйфелева | feature -- Access
|
||
Питон | def setBar(self, value): [35]
|
def getBar(self):
|
def setBar(self, value):
|
Визуальный Бейсик .NET | Property Bar() As type
|
ReadOnly Property Bar() As type
|
WriteOnly Property Bar() As type
|
Хохо | ComputedProperty Bar() As type
|
ComputedProperty Bar() As type
|
ComputedProperty Bar() As type
|
PHP | function __get($property) {
|
function __get($property) {
|
function __set($property, $value) {
|
Перл | sub Bar {
|
sub Bar {
|
sub Bar {
|
Раку | — | ||
Руби | def bar
|
def bar
|
def bar=(value)
|
Windows PowerShell | Add-Member
|
Add-Member
|
Add-Member
|
OCaml | — | ||
Ф# | member this.Bar with get() = expression and set(value) = expression
|
member this.Bar = expression
|
member this.Bar with set(value) = expression
|
JavaScript (ES6) | get bar(«parameters») { instructions ... return value}set bar(«parameters») { instructions }
|
get bar(«parameters») { instructions ... return value}
|
set bar(«parameters») { instructions }
|
КОБОЛ | METHOD-ID. GET PROPERTY bar.
instructions
instructions
|
METHOD-ID. GET PROPERTY bar.
instructions
|
METHOD-ID. SET PROPERTY bar.
instructions
|
Кобра | pro bar «as type»
|
get bar «as type»
|
set bar «as type»
|
ИСЛИСП | — |
Автоматически реализовано [ править ]
чтение-запись | только для чтения | только для записи | |
---|---|---|---|
ABAP-объекты | — | ||
С++ | — | ||
С# | type Bar { get; set; }
|
type Bar { get; private set; }
|
type Bar { private get; set; }
|
Д | — | ||
Ява | — | ||
Цель-C 2.0 (Какао) | @property (readwrite) type bar; а затем внутри @implementation
|
@property (readonly) type bar; а затем внутри @implementation
|
— |
Быстрый | var bar : type
|
let bar : type
|
— |
Эйфелева | |||
Питон | @property
|
@property
|
bar = property()
|
Визуальный Бейсик .NET | Property Bar As type« = initial_value» (VB 10)
|
||
PHP | |||
Перл [36] | use base qw(Class::Accessor);
|
use base qw(Class::Accessor);
|
use base qw(Class::Accessor);
|
Раку | — | ||
Руби | attr_accessor :bar
|
attr_reader :bar
|
attr_writer :bar
|
Windows PowerShell | |||
OCaml | — | ||
Ф# | member val Bar = value with get, set
|
||
КОБОЛ | level-number bar clauses PROPERTY.
|
level-number bar clauses PROPERTY «WITH» NO SET.
|
level-number bar clauses PROPERTY «WITH» NO GET.
|
Кобра | pro bar from var «as type»
|
get bar from var «as type»
|
set bar from var «as type»
|
Перегруженные операторы [ править ]
Стандартные операторы [ править ]
унарный | двоичный | вызов функции | |
---|---|---|---|
ABAP-объекты | — | ||
С++ | type operator symbol () { instructions }
|
type operator symbol (type operand2) { instructions }
|
type operator () («parameters») { instructions }
|
С# | static type operator symbol(type operand) { instructions }
|
static type operator symbol(type operand1, type operand2) { instructions }
|
— |
Д | type opUnary(string s)() if (s == "symbol") { instructions }
|
type opBinary(string s)(type operand2) if (s == "symbol") { instructions }
|
type opCall(«parameters») { instructions }
|
Ява | — | ||
Цель-C | |||
Быстрый | func symbol(operand1 : type) -> returntype { instructions } (вне класса)
|
func symbol(operand1 : type1, operand2 : type2) -> returntype { instructions } (вне класса)
|
|
Эйфелева [37] | op_name alias "symbol": TYPE
|
op_name alias "symbol" (operand: TYPE1): TYPE2
|
|
Питон | def __opname__(self):
|
def __opname__(self, operand2):
|
def __call__(self«, parameters»):
|
Визуальный Бейсик .NET | Shared Operator symbol(operand As type) As type
|
Shared Operator symbol(operand1 As type, operand2 As type) As type
|
— |
Хохо | Function Operator_name(operand As type) As type
|
— | |
PHP | [38] | function __invoke(«parameters») { instructions } (PHP 5.3+)
| |
Перл | use overload "symbol" => sub { my ($self) = @_; instructions };
|
use overload "symbol" => sub { my ($self, $operand2, $operands_reversed) = @_; instructions };
|
|
Раку | «our «type »»«multi »method prefix:<symbol> («$operand: ») { instructions ... return value; } or
|
«our «type »»«multi »method infix:<symbol> («$operand1: » type operand2) { instructions ... return value; }
|
«our «type »»«multi »method postcircumfix:<( )> («$self: » «parameters») { instructions }
|
Руби | def symbol
|
def symbol(operand2)
|
— |
Windows PowerShell | — | ||
OCaml | |||
Ф# | static member (symbol) operand = expression
|
static member (symbol) (operand1, operand2) = expression
|
— |
КОБОЛ | — | ||
ИСЛИСП | — |
Индексаторы [ править ]
чтение-запись | только для чтения | только для записи | |
---|---|---|---|
ABAP-объекты | — | ||
АПЛ (Диалог) | :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
|
С++ | type& operator[](type index) { instructions }
|
type operator[](type index) { instructions }
|
|
С# | type this[type index] {
|
type this[type index] { get{ instructions } }
|
type this[type index] { set{ instructions } }
|
Д | type opIndex(type index) { instructions }
|
type opIndex(type index) { instructions }
|
type opIndexAssign(type value, type index) { instructions }
|
Ява | — | ||
Objective-C (последний компилятор Clang) | — | - (id)objectAtIndexedSubscript:(NSUInteger)index { instructions return value; } or
|
- (void)setObject:(id)value atIndexedSubscript:(NSUInteger)index { instructions } or
|
Быстрый | subscript (index : type) -> returntype { get { instructions } set«(newIndex)» { instructions } }
|
subscript (index : type) -> returntype { instructions }
|
|
Эйфелева [37] | bracket_name alias "[]" (index: TYPE): TYPE assign set_item
|
bracket_name alias "[]" (index: TYPE): TYPE
|
|
Питон | def __getitem__(self, index):
|
def __getitem__(self, index):
|
def __setitem__(self, index, value):
|
Визуальный Бейсик .NET | Default Property Item(Index As type) As type
|
Default ReadOnly Property Item(Index As type) As type
|
Default WriteOnly Property Item(Index As type) As type
|
PHP | [39] | ||
Перл | [40] | ||
Раку | «our «type »»«multi »method postcircumfix:<[ ]> is rw («$self: » type $index) { instructions ... return value; } or
|
«our «type »»«multi »method postcircumfix:<[ ]>(«$self: » type $index) { instructions ... return value; } or
|
— |
Руби | def [](index)
|
def [](index)
|
def []=(index, value)
|
Windows PowerShell | — | ||
OCaml | |||
Ф# | 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
|
КОБОЛ | — | ||
Кобра | pro[index «as type»] as type
|
get[index «as type»] as type
|
set[index «as type»] as type
|
Приведение типов [ править ]
подавленный | поднятый вверх | |
---|---|---|
ABAP-объекты | — | |
С++ | operator returntype() { instructions }
| |
С# | static explicit operator returntype(type operand) { instructions }
|
static implicit operator returntype(type operand) { instructions }
|
Д | T opCast(T)() if (is(T == type)) { instructions }
| |
ЕС | property T { get { return «conversion code»; } }
| |
Ява | — | |
Цель-C | ||
Эйфелева [37] | ||
Питон | ||
Визуальный Бейсик .NET | Shared Narrowing Operator CType(operand As type) As returntype
|
Shared Widening Operator CType(operand As type) As returntype
|
PHP | — | |
Перл | ||
Раку | multi method type«($self:)» is export { instructions }
| |
Руби | — | |
Windows PowerShell | ||
OCaml | ||
Ф# | ||
КОБОЛ | — |
Доступ для участников [ править ]
Как получить доступ к членам объекта x
член объекта | член класса | член пространства имен | |||
---|---|---|---|---|---|
метод | поле | свойство | |||
ABAP-объекты | x->method(«parameters»). [41]
|
x->field
|
— | x=>field or x=>method(«parameters[41]»).
|
— |
С++ | x.method(parameters) or
|
x.field or
|
cls::member
|
ns::member
| |
Цель-C | [x method«:parameter «bar:parameter ...»»]
|
x->field
|
x.property (2.0 only) or
|
[cls method«:parameter «bar:parameter ...»»]
|
|
Смолток | x method«:parameter «bar:parameter ...»»
|
— | cls method«:parameter «bar:parameter ...»»
|
||
Быстрый | x.method(parameters)
|
x.property
|
cls.member
|
||
АПЛ (Диалог) | left argument» x.method «right argument(s)»
|
x.field
|
x.property
|
cls.member
|
ns.member
|
С# | x.method(parameters)
| ||||
Ява | — | ||||
Д | x.property
| ||||
Питон | |||||
Визуальный Бейсик .NET | |||||
Хохо | |||||
Windows PowerShell | [cls]::member
| ||||
Ф# | — | cls.member
| |||
ЕС | x.method«(parameters)»
|
x.field
|
x.property
|
cls::member
|
ns::member
|
Эйфелева | x.method«(parameters)»
|
x.field
|
{cls}.member
|
— | |
Руби | — | x.property
|
cls.member
| ||
PHP | x->method(parameters)
|
x->field
|
x->property
|
cls::member
|
ns\member
|
Перл | x->method«(parameters)»
|
x->{field}
|
cls->method«(parameters)»
|
ns::member
| |
Раку | x.method«(parameters)» or
|
x.field or
|
cls.method«(parameters)» or
|
ns::member
| |
OCaml | x#method «parameters»
|
— | |||
JavaScript | x.method(parameters)
|
x.field
|
x.property
|
cls.member
|
— |
КОБОЛ | INVOKE x "method" «USING parameters» «RETURNING result» or
|
— | property OF x
|
INVOKE cls "method" «USING parameters» «RETURNING result» or
|
— |
Кобра | x.method«(parameters)»
|
x.field
|
x.property
|
cls.member
|
ns.member
|
Доступность участников [ править ]
Имеет член? | Обработчик отсутствующего члена | |||
---|---|---|---|---|
Метод | Поле | Метод | Поле | |
АПЛ (Диалог) | 3=x.⎕NC'method'
|
2=x.⎕NC'method'
|
— | |
ABAP-объекты | — | |||
С++ | ||||
Цель-C (Какао) | [x respondsToSelector:@selector(method)]
|
— | forwardInvocation:
|
— |
Смолток | x respondsTo: selector
|
— | doesNotUnderstand:
|
— |
С# | (используя отражение) | |||
ЕС | ||||
Ява | ||||
Д | opDispatch()
| |||
Эйфелева | — | |||
Питон | hasattr(x, "method") and callable(x.method)
|
hasattr(x, "field")
|
__getattr__()
| |
Визуальный Бейсик .NET | (используя отражение) | |||
Хохо | (используя самоанализ) | |||
Windows PowerShell | (используя отражение) | |||
Ф# | (используя отражение) | |||
Руби | x.respond_to?(:method)
|
— | method_missing()
|
— |
PHP | method_exists(x, "method")
|
property_exists(x, "field")
|
__call()
|
__get() / __set()
|
Перл | x->can("method")
|
exists x->{field}
|
АВТОЗАГРУЗКА | |
Раку | x.can("method")
|
x.field.defined
|
АВТОЗАГРУЗКА | |
OCaml | — | |||
JavaScript | typeof x.method === "function"
|
field in x
|
||
КОБОЛ | — |
Специальные переменные [ править ]
текущий объект | текущего объекта родительский объект | нулевая ссылка | Текущий контекст выполнения | |
---|---|---|---|---|
Смолток | self
|
super
|
nil
|
thisContext
|
ABAP-объекты | me
|
super
|
initial
|
|
АПЛ (Диалог) | ⎕THIS
|
⎕BASE
|
⎕NULL
|
|
С++ | *this
|
[42] | NULL, nullptr
|
|
С# | this
|
base [43]
|
null
|
|
Ява | super [43]
|
|||
Д | ||||
JavaScript | super [43] (ECMAScript 6)
|
null, undefined [44]
|
||
ЕС | this
|
null
|
||
Цель-C | self
|
super [43]
|
nil
|
|
Быстрый | self
|
super [43]
|
nil [45]
|
|
Питон | self [46]
|
super(current_class_name, self) [7] super() (только 3.x)
|
None
|
|
Визуальный Бейсик .NET | Me
|
MyBase
|
Nothing
|
|
Хохо | Me / Self
|
Parent
|
Nil
|
|
Эйфелева | Current
|
Precursor «{superclass}» «(args)» [43] [47]
|
Void
|
|
PHP | $this
|
parent [43]
|
null
|
|
Перл | $self [46]
|
$self->SUPER [43]
|
undef
|
|
Раку | self
|
SUPER
|
Nil
|
|
Руби | self
|
super«(args)» [48]
|
nil
|
binding
|
Windows PowerShell | $this
|
$NULL
|
||
OCaml | self [49]
|
super [50]
|
— [51] | |
Ф# | this
|
base [43]
|
null
|
|
КОБОЛ | SELF
|
SUPER
|
NULL
|
|
Кобра | this
|
base
|
nil
|
Специальные методы [ править ]
Строковое представление | Копия объекта | Равенство ценностей | Сравнение объектов | Хэш-код | Идентификатор объекта | ||
---|---|---|---|---|---|---|---|
Человекочитаемый | Совместимость с исходным кодом | ||||||
ABAP-объекты | — | ||||||
АПЛ (Диалог) | ⍕x
|
⎕SRC x
|
⎕NS x
|
x = y
|
— | ||
С++ | x == y [52]
|
указатель на объект может быть преобразован в целочисленный идентификатор | |||||
С# | x.ToString()
|
x.Clone()
|
x.Equals(y)
|
x.CompareTo(y)
|
x.GetHashCode()
|
System
| |
Ява | x.toString()
|
x.clone() [53]
|
x.equals(y)
|
x.compareTo(y) [54]
|
x.hashCode()
|
System
| |
JavaScript | x.toString()
|
||||||
Д | x.toString() or
|
x.stringof
|
x == y or
|
x.opCmp(y)
|
x.toHash()
|
||
ЕС | x.OnGetString(tempString, null, null) or
|
y.OnCopy(x)
|
x.OnCompare(y)
|
дескриптор объекта может быть преобразован в целочисленный идентификатор | |||
Цель-C (Какао) | x.description
|
x.debugDescription
|
[x copy] [55]
|
[x isEqual:y]
|
[x compare:y] [56]
|
x.hash
|
указатель на объект может быть преобразован в целочисленный идентификатор |
Быстрый | x.description [57]
|
x.debugDescription [58]
|
x == y [59]
|
x < y [60]
|
x.hashValue [61]
|
reflect(x)
| |
Смолток | x displayString
|
x printString
|
x copy
|
x = y
|
x hash
|
x identityHash
| |
Питон | str(x) [62]
|
repr(x) [63]
|
copy.copy(x) [64]
|
x == y [65]
|
cmp(x, y) [66]
|
hash(x) [67]
|
id(x)
|
Визуальный Бейсик .NET | x.ToString()
|
x.Clone()
|
x.Equals(y)
|
x.CompareTo(y)
|
x.GetHashCode()
|
||
Эйфелева | x.out
|
x.twin
|
x.is_equal(y)
|
Когда х COMPARABLE , можно просто сделать x < y
|
Когда х HASHABLE , можно использовать x.hash_code
|
Когда х IDENTIFIED , можно использовать x.object_id
| |
PHP | $x->__toString()
|
clone x [68]
|
x == y
|
|
spl_object_hash(x)
| ||
Перл | "$x" [69]
|
Data::Dumper [70]
|
Storable [71]
|
Scalar [72]
| |||
Раку | ~x [69]
|
x.perl
|
x.clone
|
x eqv y
|
x cmp y
|
x.WHICH
| |
Руби | x.to_s
|
x.inspect
|
x.dup or
|
x == y or
|
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
| |||
Ф# | string x or x
|
sprintf "%A" x
|
x.Clone()
|
x = y or x
|
compare x y or x
|
hash x or x
|
|
КОБОЛ | — |
Тип манипуляции [ править ]
Получить тип объекта | Является экземпляром (включая подтипы) | Upcasting | Даункастинг | ||
---|---|---|---|---|---|
Проверка времени выполнения | Нет чека | ||||
ABAP-объекты | — [73] | = | ?= | ||
С++ | typeid(x)
|
dynamic_cast<type *>(&x) != nullptr
|
— [74] | dynamic_cast<type*>(ptr)
|
(type*) ptr or
|
С# | x.GetType()
|
x is type
|
(type) x or x as type
|
||
Д | typeid(x)
|
cast(type) x
|
|||
Дельфи | x is type
|
x as type
|
|||
ЕС | x._class
|
eClass_IsDerived(x._class, type)
|
(type) x
| ||
Ява | x.getClass()
|
x instanceof class
|
(type) x
|
||
Цель-C (Какао) | [x class] [75]
|
[x isKindOfClass:[class class]]
|
(type*) x
| ||
Быстрый | x.dynamicType
|
x is type
|
x as! type x as? type
| ||
JavaScript | x.constructor (If not rewritten.)
|
x instanceof class
|
— [76] | ||
Визуальный Бейсик .NET | x.GetType()
|
TypeOf x Is type
|
— [74] | CType(x, type) or TryCast(x, type)
|
|
Хохо | Introspection.GetType(x)
|
x IsA type
|
— | CType(x, type)
|
— |
Эйфелева | x.generating_type
|
attached {TYPE} x
|
attached {TYPE} x as down_x
|
||
Питон | type(x)
|
isinstance(x, type)
|
— [76] | ||
PHP | get_class(x)
|
x instanceof class
| |||
Перл | ref(x)
|
x->isa("class")
| |||
Раку | x.WHAT
|
x.isa(class)
|
— [74] | type(x) or
|
|
Руби | x.class
|
x.instance_of?(type) or
|
— [76] | ||
Смолток | x class
|
x isKindOf: class
| |||
Windows PowerShell | x.GetType()
|
x -is [type]
|
— [74] | [type]x or x -as [type]
|
|
OCaml | — [77] | (x :> type)
|
— | ||
Ф# | x.GetType()
|
x :? type
|
(x :?> type)
|
||
КОБОЛ | — | x AS type [74]
|
— |
Управление пространством имен [ править ]
Импортировать пространство имен | Импортировать элемент | ||
---|---|---|---|
квалифицированный | неквалифицированный | ||
ABAP-объекты | |||
С++ | using namespace ns;
|
using ns::item ;
| |
С# | using ns;
|
using item = ns.item;
| |
Д | import ns;
|
import ns : item;
| |
Ява | import ns.*;
|
import ns.item;
| |
Цель-C | |||
Визуальный Бейсик .NET | Imports ns
|
||
Эйфелева | |||
Питон | import ns
|
from ns import *
|
from ns import item
|
PHP | use ns;
|
use ns\item;
| |
Перл | use ns;
|
use ns qw(item);
| |
Раку | |||
Руби | |||
Windows PowerShell | |||
OCaml | open ns
|
||
Ф# | |||
КОБОЛ | — |
Контракты [ править ]
Предварительное условие | Постусловие | Проверять | Инвариант | Петля | |
---|---|---|---|---|---|
ABAP-объекты | — | ||||
С++ | |||||
С# | Spec#:
|
Spec#:
| |||
Ява | — | ||||
Цель-C | |||||
Визуальный Бейсик .NET | |||||
Д | f
|
f
|
assert(expression)
|
invariant() { expression }
|
|
Эйфелева | f
|
f
|
f
|
class X
|
from instructions
|
Питон | — | ||||
PHP | |||||
Перл | |||||
Раку | PRE { condition }
|
POST { condition }
|
|||
Руби | — | ||||
Windows PowerShell | |||||
OCaml | |||||
Ф# | |||||
КОБОЛ |
См. также [ править ]
Ссылки и примечания [ править ]
- ^ параметр = аргумент может повторяться, если у конструктора несколько параметров
- ^ SAP оставил за собой возможность разрушения
- ^ Jump up to: а б с д и ж г час я дж к л Этот язык использует сбор мусора для освобождения неиспользуемой памяти.
- ^ Этот синтаксис создает значение объекта с автоматической продолжительностью хранения.
- ^ Этот синтаксис создает объект с динамическим сроком хранения и возвращает указатель на него.
- ^ Объекты OCaml можно создавать напрямую, минуя класс.
- ^ Jump up to: а б с д и ж г Этот язык поддерживает множественное наследование . Класс может иметь более одного родительского класса
- ^ Отсутствие родительского класса делает класс корневым. На практике этого почти никогда не делается. Обычно следует использовать обычный базовый класс используемой структуры, который
NSObject
для Какао и GNUstep илиObject
в противном случае. - ^ Обычно
@interface
часть помещается в заголовочный файл , а@interface
часть помещается в отдельный файл исходного кода. - ^ Префиксы к именам классов и протоколов, традиционно используемые как своего рода пространство имен.
- ^ В интерфейсах Python — это классы, методы которых являются их телами.
- ^ Класс является объектом.
Просто отправьте сообщение в суперкласс (st-80) или в пространство имен назначения (Visualworks). - ^ Пространство имен является объектом.
Просто отправьте сообщение в родительское пространство имен. - ^ Финализатор . вызывается сборщиком мусора, когда объект готовится к сбору мусора Нет никакой гарантии, когда он будет вызван и будет ли он вызван вообще.
- ^ В ABAP конструктор должен быть определен как метод (см. комментарии к методу) со следующими ограничениями: имя метода должно быть «конструктор», и могут быть определены только «импортирующие» параметры.
- ^ Здесь находится необязательный список инициализаторов, разделенных запятыми, для объектов-членов и родительских классов. Синтаксис инициализации объектов-членов:
"member_name(parameters)"
"class_name(parameters)".
- ^ Любая процедура Eiffel может использоваться в качестве процедуры создания, она же конструктор. См. параграф Эйфеля в Конструкторе (информатика) .
- ^ Реализация {DISPOSABLE}.dispose гарантирует, что Dispose будет вызываться при сборке мусора.
- ^ Эта конструкция «инициализатора» используется редко. Поля в OCaml обычно инициализируются непосредственно в их объявлении. Только когда необходимы дополнительные императивные операции, используется «инициализатор». «Параметры конструктора» на других языках вместо этого указываются как параметры класса в OCaml. Дополнительные сведения см. в синтаксисе объявления класса.
- ^ Этот синтаксис обычно используется для перегрузки конструкторов.
- ^ В JavaScript конструктор — это объект.
- ^ Конструкторы можно эмулировать с помощью фабричного метода, возвращающего экземпляр класса.
- ^ Jump up to: а б с Идентификатор области должен появиться один раз в объявлении файла, все объявления переменных после этого идентификатора области имеют его область действия, пока не будет достигнут другой идентификатор области или конец объявления класса.
- ^ В ABAP определенные поля или методы не объявляются доступными для внешних объектов. Скорее, внешние классы объявляются как друзья, чтобы иметь доступ к полям или методам класса.
- ^ В C++ определенные поля не объявляются доступными для внешних объектов. Скорее, внешние функции и классы объявляются как друзья, чтобы иметь доступ к полям класса. см . функцию друга и класс друга . Подробнее
- ^ Просто отправьте сообщение классу.
class addInstVarName: field. class removeInstVarName: field.
- ^ Jump up to: а б с д Просто присвойте ему значение в методе
- ^ В Python нет частных полей — все поля всегда общедоступны. Существует соглашение сообщества, согласно которому детали реализации предваряются одним подчеркиванием, но это не поддерживается языком.
- ^ Все данные класса являются «частными», поскольку стандарт COBOL не определяет никакого способа доступа к ним.
- ^ Объявление и реализация методов в ABAP разделены. Оператор методов должен использоваться внутри определения класса. метод (без «s») должен использоваться внутри реализации класса. параметр = аргумент может повторяться, если параметров несколько.
- ^ В ABAP имя возвращаемого параметра явно определено в сигнатуре метода в определении класса.
- ^ В C++ объявление и реализация методов обычно разделены. Методы объявляются в определении класса (которое обычно включается в заголовочный файл ) с использованием синтаксиса
- ^ Хотя тело метода может быть включено в объявление внутри определения класса, как показано в таблице, это, как правило, плохая практика. Поскольку определение класса должно быть включено в каждый исходный файл, в котором используются поля или методы класса, наличие кода в определении класса приводит к компиляции кода метода с каждым исходным файлом, что увеличивает размер кода. Тем не менее, в некоторых случаях полезно включать в объявление тело метода. Одна из причин заключается в том, что компилятор попытается встроить методы, включенные в объявление класса; поэтому, если встречается очень короткий однострочный метод, компилятор может ускорить его встраивание, включив тело вместе с объявлением. Кроме того, если встречается шаблонный класс или метод, тогда весь код должен быть включен в объявление, поскольку только с помощью кода можно создать экземпляр шаблона.
- ^ Jump up to: а б Просто назначьте ему функцию в методе
- ^ Альтернативная реализация:
def bar(): doc = "The bar property." def fget(self): return self._bar def fset(self, value): self._bar = value return locals() bar = property(**bar())
- ^ для этих примеров требуется Class::Accessor. установленный модуль
- ^ Jump up to: а б с Хотя Eiffel не поддерживает перегрузку операторов, он может определять операторы
- ^ PHP не поддерживает перегрузку операторов изначально, но поддержку можно добавить с помощью пакета PECL «operator» .
- ^ Класс должен реализовывать интерфейс ArrayAccess .
- ^ Класс должен перегрузить '@{}' (разыменование массива) или создать подкласс одного из Tie::Array или Tie::StdArray для перехвата операций с массивом.
- ^ Jump up to: а б В ABAP аргументы должны передаваться с использованием следующего синтаксиса:
x->method(«exporting parameter = argument» «importing parameter = argument» «changing parameter = argument» «returning value(parameter)»
parameter = argument
можно повторить, если имеется несколько параметров
- ^ В C++ нет ключевого слова «super», поскольку возможно множественное наследование, и поэтому может быть неоднозначно, на какой базовый класс ссылаются. Вместо этого
BaseClassName::member
синтаксис можно использовать для доступа к переопределенному члену в указанном базовом классе. Microsoft Visual C++ предоставляет для этой цели нестандартное ключевое слово «__super»; но это не поддерживается другими компиляторами. [1] - ^ Jump up to: а б с д и ж г час я Ключевое слово здесь не является значением и может использоваться только для доступа к методу суперкласса.
- ^ Но бойтесь, они не имеют одинаковой ценности.
- ^ только для необязательных типов
- ^ Jump up to: а б В этом языке методам экземпляра передается текущий объект в качестве первого параметра, который обычно называется «self», но это не обязательно.
- ^ «Предшественник» в Eiffel на самом деле является вызовом одноименного метода в суперклассе. Таким образом, Precursor(args) эквивалентен «super.currentMethodName(args)» в Java. В суперклассе невозможно вызвать метод с другим именем.
- ^ «супер» в Ruby, в отличие от других языков, на самом деле является вызовом одноименного метода в суперклассе. Таким образом, super(args) в Ruby эквивалентен «super.currentMethodName(args)» в Java. В суперклассе невозможно вызвать метод с другим именем.
- ^ В OCaml объявление объекта может начинаться с параметра, который будет связан с текущим объектом. Этот параметр обычно называется «self», но это не обязательно. Хорошей практикой является размещение там параметра, чтобы можно было вызывать собственные методы.
- ^ В OCaml объявление наследования («наследовать») может быть дополнительно связано со значением с помощью синтаксиса « наследовать родительский_класс «параметры» как супер». Здесь «супер» — это имя, присвоенное переменной, связанной с этим родительским объектом. Его можно назвать по-другому.
- ^ Однако, если необходима возможность иметь «необязательное» значение в OCaml, оберните это значение внутри
option
тип, какие значенияNone
иSome x
, который можно использовать для представления «нулевой ссылки» и «ненулевой ссылки на объект», как и в других языках. - ^ при условии, что «x» и «y» являются объектами (а не указателями). Можно настроить, перегрузив объект
==
оператор - ^ Доступно только внутри класса, поскольку
clone()
метод, унаследованный отObject
защищен, если класс не переопределяет метод и не делает его общедоступным. Если использоватьclone()
унаследовано отObject
, класс должен реализоватьCloneable
интерфейс, позволяющий клонировать. - ^ Класс должен реализовывать интерфейс
Comparable
чтобы этот метод был стандартизирован. - ^ Реализовано объектом
copyWithZone:
метод - ^
compare:
— общепринятое название метода сравнения в базовых классах. Однако формального протокола не существует. - ^ Только если объект соответствует
Printable
протокол - ^ Только если объект соответствует
DebugPrintable
протокол - ^ Только если объект соответствует
Equatable
протокол - ^ Только если объект соответствует
Comparable
протокол - ^ Только если объект соответствует
hashValue
протокол - ^ Может быть настроена объектом
__str__()
метод - ^ Может быть настроена объектом
__repr__()
метод - ^ Может быть настроена объектом
__copy__()
метод - ^ Может быть настроена объектом
__eq__()
метод - ^ Только в Python 2.x и более ранних версиях (удалено в Python 3.0). Может быть настроен объектом
__cmp__()
метод - ^ Может быть настроена объектом
__hash__()
метод. Не все типы хешируются (изменяемые типы обычно не хэшируются) - ^ Может быть настроена объектом
__clone()
метод - ^ Jump up to: а б Можно настроить, перегрузив оператор преобразования строк объекта.
- ^ Этот пример требует использования Data ::Dumper.
- ^ Для этого примера требуется использование Storable .
- ^ В этом примере требуется использование Scalar ::Util.
- ^ Информацию о типах времени выполнения в ABAP можно собрать с помощью различных классов описания, таких как CL_ABAP_CLASSDESCR.
- ^ Jump up to: а б с д и В этом языке преобразование неявно. Экземпляр подтипа можно использовать там, где необходим супертип.
- ^ Только для объектов, не принадлежащих к классу. Если
x
это объект класса,[x class]
возвращает толькоx
. Метод времени выполненияobject_getClass(x)
вернет классx
для всех объектов. - ^ Jump up to: а б с Этот язык является динамически типизированным. Приведение типов между типами не требуется.
- ^ Этот язык не предоставляет информацию о типах во время выполнения. В этом нет необходимости, поскольку оно статически типизировано и понижающее приведение невозможно.