Jump to content

Сравнение языков программирования (объектно-ориентированное программирование)

В этом сравнении языков программирования сравнивается то, как объектно-ориентированные языки программирования, такие как C++ , Java , Smalltalk , Object Pascal , Perl , Python и другие, манипулируют структурами данных .

Строительство и разрушение объекта [ править ]

строительство разрушение
ABAP-объекты data variable type ref to class .
create object variable «exporting parameter = argument».
[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.
class name implementation. method_implementations 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;
members
ЕС 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
@implementation
name method_implementations @end
[9]
@protocol name«< parentprotocols >» members @end [10]
Быстрый class name« : «parentclass»«, protocols»» { members } protocol name« : parentprotocols» { members }
Питон class name«(parentclasses[7])»:
Tab ↹
members
[11] __all__ = [ member1,member2,... ]
Визуальный Бейсик .NET Class name« Inherits parentclass»« Implements interfaces»
members
End Class
Interface name« Inherits parentinterfaces»
members
End Interface
Namespace name
members
End Namespace
Хохо Class name« Inherits parentclass»« Implements interfaces»
members
End Class
Interface name« Inherits parentinterfaces»
members
End Interface
Module name
members
End Module
Эйфелева class name« inherit parentclasses[7]»
members
end
Перл 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»
members
end
module name
members
end
Windows PowerShell
OCaml class name «parameters» = object «(self)» «inherit parentclass «parameters» «inherit parentclass «parameters» ...[7]»» members end module name
members
Ф# 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
Смолток [12] [13]
JavaScript (ES6) class name «extends parentclass» { members }
Объектный Паскаль (Делфи)

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

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.

END CLASS name.

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

END INTERFACE name.

Кобра class name «inherits parentclass» «implements interfaces»
Tab ↹ members
interface name «inherits parentinterfaces»
Tab ↹ members
namespace name
Tab ↹ members
ИСЛИСП (defclass name (base-class) ((x :initform 0 :accessor get-x :initarg x)) (:abstractp nil))

Члены класса [ править ]

Конструкторы и деструкторы [ править ]

конструктор деструктор финализатор [14]
ABAP-объекты methods constructor «importing parameter = argument»
method constructor. instructions endmethod.
[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
- (id)initWithFoo:parameter «bar:parameter ...» { instructions... return self; }
- (void)dealloc { instructions } - (void)finalize { instructions }
Быстрый init(«parameters») { instructions } deinit { instructions }
Питон def __init__(self«, parameters»):
Tab ↹ instructions
def __del__(self):
Tab ↹ instructions
Визуальный Бейсик .NET Sub New(«parameters»)
instructions
End Sub
Sub Dispose()
instructions
End Sub
Overrides Sub Finalize()
instructions
End Sub
Хохо Sub Constructor(«parameters»)
instructions
End Sub
Sub Destructor()
instructions
End Sub
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
«multi » method new(««$self: »parameters») { self.bless(*, field1 => value1, ...); ... instructions }
submethod DESTROY { instructions }
Руби def initialize«(parameters)»
instructions
end
Windows PowerShell
OCaml initializer instructions[19]
Ф# do instructions or
new(parameters) = expression
[20]
member this.Dispose() = instructions override this.Finalize() = instructions
JavaScript function name(«parameters») { instructions }[21]
JavaScript (ES6) constructor(«parameters») { instructions }
КОБОЛ [22]
Кобра cue init(parameters)
Tab ↹ base.init
Tab ↹ instructions
def dispose
Tab ↹ instructions
ИСЛИСП (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
field: TYPE
feature {NONE}
field: TYPE
feature {current_class}
field: TYPE
feature {FRIEND}
field: TYPE
Цель-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
«-MemberType »NoteProperty
«-Name »Bar «-Value »value
-InputObject variable
OCaml val «mutable» field = value
Ф# let «mutable» field = value
JavaScript this.field = value
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)»
method name. instructions endmethod.
[30]
[31]
АПЛ (Диалог) «left argument» name «right arguments»
instructions
result «left argument» name «right arguments»
instructions
С++ [32]
type foo(«parameters»);

Реализация методов обычно предоставляется в отдельном исходном файле со следующим синтаксисом.

type class::foo(«parameters») { instructions }[33]
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» )
do
instructions
end
foo ( «parameters» ): TYPE
do
instructions...
Result := value
end
Цель-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»):
Tab ↹
instructions
def foo(self«, parameters»):
Tab ↹
instructions
Tab ↹ return
value
Визуальный Бейсик .NET Sub Foo(«parameters»)
instructions
End Sub
Function Foo(«parameters») As type
instructions
...
Return value
End Function
Хохо Sub Foo(«parameters»)
instructions
End Sub
Function Foo(«parameters») As type
instructions
...
Return value
End Function
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)»
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
Ф# member this.foo(«parameters») = expression
JavaScript this.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;}
КОБОЛ METHOD-ID. foo.
«DATA DIVISION.
LINKAGE SECTION.
parameter declarations»
PROCEDURE DIVISION« USING parameters».
    instructions

END METHOD foo.

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

END METHOD foo.

Кобра def foo(parameters)
Tab ↹ instructions
def foo(parameters) as type
Tab ↹ instructions
Tab ↹ return value
ИСЛИСП (defgeneric method (arg1 arg2))
(defmethod method ((arg1 <class1> arg2 <class2>) ...)

Свойства [ править ]

Как задекларировать недвижимость под названием «Бар»

Вручную реализовано [ править ]

чтение-запись только для чтения только для записи
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 {
get {
instructions ... return value; }
set {
instructions } }
type Bar { get { instructions ... return value; } } type Bar { set { instructions } }
Д @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; }
ЕС property type Bar {
get {
instructions ... return value; }
set {
instructions } }
property type Bar { get { instructions ... return value; } } property type Bar { set { instructions } }
Ява
Цель-C 2.0 (Какао) @property (readwrite) type bar;
а затем внутри
@implementation
- (type)bar { instructions }
- (void)setBar:(type)value { instructions }
@property (readonly) type bar;
а затем внутри
@implementation
- (type)bar { instructions }
Быстрый var bar : type { get { instructions } set«(newBar)» { instructions } } var bar : type { instructions }
Эйфелева feature -- Access
x: TYPE assign set_x
feature -- Settings
set_x (a_x: like x) do instructions ensure x_set: verification end
Питон def 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)
Визуальный Бейсик .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
Хохо 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
} }
Перл 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";
}
}
Раку
Руби 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
Ф# 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.
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.

Кобра pro 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
ИСЛИСП

Автоматически реализовано [ править ]

чтение-запись только для чтения только для записи
ABAP-объекты
С++
С# type Bar { get; set; } type Bar { get; private set; } type Bar { private get; set; }
Д
Ява
Цель-C 2.0 (Какао) @property (readwrite) type bar;
а затем внутри @implementation
@synthesize bar;
@property (readonly) type bar;
а затем внутри @implementation
@synthesize bar;
Быстрый var bar : type let bar : type
Эйфелева
Питон @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
Визуальный Бейсик .NET Property Bar As type« = initial_value» (VB 10)
PHP
Перл [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');
Раку
Руби 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 opBinaryRight(string s)(type operand1) if (s == "symbol") switch (s) { 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
do instructions end
op_name alias "symbol" (operand: TYPE1): TYPE2
do instructions end
Питон def __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
Визуальный Бейсик .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
Хохо Function Operator_name(operand As type) As type
instructions
End Function
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 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 }
Руби def symbol
instructions
expression resulting in return value
end
def symbol(operand2)
instructions
expression resulting in return value
end
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] {
get{
instructions }
set{
instructions } }
type this[type index] { get{ instructions } } type this[type index] { set{ instructions } }
Д type opIndex(type index) { instructions }
type opIndexAssign(type value, 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
- (id)objectForKeyedSubscript:(id)index { instructions return value; }
- (void)setObject:(id)value atIndexedSubscript:(NSUInteger)index { instructions } or
- (void)setObject:(id)value forKeyedSubscript:(id)index { instructions }
Быстрый subscript (index : type) -> returntype { get { instructions } set«(newIndex)» { instructions } } subscript (index : type) -> returntype { instructions }
Эйфелева [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
Питон 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
Визуальный Бейсик .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 [39]
Перл [40]
Раку «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; }
Руби 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
Ф# 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
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

Приведение типов [ править ]

подавленный поднятый вверх
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
instructions
End Operator
Shared Widening Operator CType(operand As type) As returntype
instructions
End Operator
PHP
Перл
Раку multi method type«($self:)» is export { instructions }
Руби
Windows PowerShell
OCaml
Ф#
КОБОЛ

Доступ для участников [ править ]

Как получить доступ к членам объекта x

член объекта член класса член пространства имен
метод поле свойство
ABAP-объекты x->methodparameters»).[41] x->field x=>field or x=>methodparameters[41]»).
С++ x.method(parameters) or
ptr->method(parameters)
x.field or
ptr->field
cls::member ns::member
Цель-C [x method«:parameter «bar:parameter ...»»] x->field x.property (2.0 only) or
[x property]
[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!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"]
cls.member
cls["member"]
КОБОЛ INVOKE x "method" «USING parameters» «RETURNING result» or
x::"method"«(«parameters»)»
property OF x INVOKE cls "method" «USING parameters» «RETURNING result» or
cls::"method"«(«parameters»)» or
property OF cls
Кобра 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.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(x)
Ява x.toString() x.clone()[53] x.equals(y) x.compareTo(y)[54] x.hashCode() System.identityHashCode(x)
JavaScript x.toString()
Д x.toString() or
std.conv.to!string(x)
x.stringof x == y or
x.opEquals(y)
x.opCmp(y) x.toHash()
ЕС x.OnGetString(tempString, null, null) or
PrintString(x)
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).objectIdentifier!.uintValue()
Смолток 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->Dump([$x],['x'])[70] Storable::dclone($x)[71] Scalar::Util::refaddr( $x )[72]
Раку ~x[69] x.perl x.clone x eqv y x cmp y x.WHICH
Руби x.to_s x.inspect x.dup or
x.clone
x == y or
x.eql?(y)
x <=> y x.hash x.object_id
Windows PowerShell x.ToString() x.Clone() x.Equals(y) x.CompareTo(y) x.GetHashCode()
OCaml Oo.copy x x = y Hashtbl.hash x Oo.id x
Ф# string x or x.ToString() or sprintf "%O" x sprintf "%A" x x.Clone() x = y or x.Equals(y) compare x y or x.CompareTo(y) hash x or x.GetHashCode()
КОБОЛ

Тип манипуляции [ править ]

Получить тип объекта Является экземпляром (включая подтипы) Upcasting Даункастинг
Проверка времени выполнения Нет чека
ABAP-объекты [73] = ?=
С++ typeid(x) dynamic_cast<type *>(&x) != nullptr [74] dynamic_cast<type*>(ptr) (type*) ptr or
static_cast<type*>(ptr)
С# 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.type
Руби x.class x.instance_of?(type) or
x.kind_of?(type)
[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#:
type foo( «parameters» )
    requires expression
{
    body
}
Spec#:
type foo( «parameters» )
    ensures expression
{
    body
}
Ява
Цель-C
Визуальный Бейсик .NET
Д f
in { asserts }
body{
instructions }
f
out (result) { asserts }
body{
instructions }
assert(expression) invariant() { expression }
Эйфелева 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
Питон
PHP
Перл
Раку PRE { condition } POST { condition }
Руби
Windows PowerShell
OCaml
Ф#
КОБОЛ

См. также [ править ]

Ссылки и примечания [ править ]

  1. ^ параметр = аргумент может повторяться, если у конструктора несколько параметров
  2. ^ SAP оставил за собой возможность разрушения
  3. ^ Jump up to: а б с д и ж г час я дж к л Этот язык использует сбор мусора для освобождения неиспользуемой памяти.
  4. ^ Этот синтаксис создает значение объекта с автоматической продолжительностью хранения.
  5. ^ Этот синтаксис создает объект с динамическим сроком хранения и возвращает указатель на него.
  6. ^ Объекты OCaml можно создавать напрямую, минуя класс.
  7. ^ Jump up to: а б с д и ж г Этот язык поддерживает множественное наследование . Класс может иметь более одного родительского класса
  8. ^ Отсутствие родительского класса делает класс корневым. На практике этого почти никогда не делается. Обычно следует использовать обычный базовый класс используемой структуры, который NSObject для Какао и GNUstep или Object в противном случае.
  9. ^ Обычно @interface часть помещается в заголовочный файл , а @interface часть помещается в отдельный файл исходного кода.
  10. ^ Префиксы к именам классов и протоколов, традиционно используемые как своего рода пространство имен.
  11. ^ В интерфейсах Python — это классы, методы которых являются их телами.
  12. ^ Класс является объектом.
    Просто отправьте сообщение в суперкласс (st-80) или в пространство имен назначения (Visualworks).
  13. ^ Пространство имен является объектом.
    Просто отправьте сообщение в родительское пространство имен.
  14. ^ Финализатор . вызывается сборщиком мусора, когда объект готовится к сбору мусора Нет никакой гарантии, когда он будет вызван и будет ли он вызван вообще.
  15. ^ В ABAP конструктор должен быть определен как метод (см. комментарии к методу) со следующими ограничениями: имя метода должно быть «конструктор», и могут быть определены только «импортирующие» параметры.
  16. ^ Здесь находится необязательный список инициализаторов, разделенных запятыми, для объектов-членов и родительских классов. Синтаксис инициализации объектов-членов:
    "member_name(parameters)"
    Это работает даже для примитивных членов: в этом случае указывается один параметр, и это значение копируется в элемент. Синтаксис инициализации родительских классов:
    "class_name(parameters)".
    Если для члена или родительского класса не указан инициализатор, конструктор по умолчанию . используется
  17. ^ Любая процедура Eiffel может использоваться в качестве процедуры создания, она же конструктор. См. параграф Эйфеля в Конструкторе (информатика) .
  18. ^ Реализация {DISPOSABLE}.dispose гарантирует, что Dispose будет вызываться при сборке мусора.
  19. ^ Эта конструкция «инициализатора» используется редко. Поля в OCaml обычно инициализируются непосредственно в их объявлении. Только когда необходимы дополнительные императивные операции, используется «инициализатор». «Параметры конструктора» на других языках вместо этого указываются как параметры класса в OCaml. Дополнительные сведения см. в синтаксисе объявления класса.
  20. ^ Этот синтаксис обычно используется для перегрузки конструкторов.
  21. ^ В JavaScript конструктор — это объект.
  22. ^ Конструкторы можно эмулировать с помощью фабричного метода, возвращающего экземпляр класса.
  23. ^ Jump up to: а б с Идентификатор области должен появиться один раз в объявлении файла, все объявления переменных после этого идентификатора области имеют его область действия, пока не будет достигнут другой идентификатор области или конец объявления класса.
  24. ^ В ABAP определенные поля или методы не объявляются доступными для внешних объектов. Скорее, внешние классы объявляются как друзья, чтобы иметь доступ к полям или методам класса.
  25. ^ В C++ определенные поля не объявляются доступными для внешних объектов. Скорее, внешние функции и классы объявляются как друзья, чтобы иметь доступ к полям класса. см . функцию друга и класс друга . Подробнее
  26. ^ Просто отправьте сообщение классу.
    class addInstVarName: field.
    class removeInstVarName: field.
    
  27. ^ Jump up to: а б с д Просто присвойте ему значение в методе
  28. ^ В Python нет частных полей — все поля всегда общедоступны. Существует соглашение сообщества, согласно которому детали реализации предваряются одним подчеркиванием, но это не поддерживается языком.
  29. ^ Все данные класса являются «частными», поскольку стандарт COBOL не определяет никакого способа доступа к ним.
  30. ^ Объявление и реализация методов в ABAP разделены. Оператор методов должен использоваться внутри определения класса. метод (без «s») должен использоваться внутри реализации класса. параметр = аргумент может повторяться, если параметров несколько.
  31. ^ В ABAP имя возвращаемого параметра явно определено в сигнатуре метода в определении класса.
  32. ^ В C++ объявление и реализация методов обычно разделены. Методы объявляются в определении класса (которое обычно включается в заголовочный файл ) с использованием синтаксиса
  33. ^ Хотя тело метода может быть включено в объявление внутри определения класса, как показано в таблице, это, как правило, плохая практика. Поскольку определение класса должно быть включено в каждый исходный файл, в котором используются поля или методы класса, наличие кода в определении класса приводит к компиляции кода метода с каждым исходным файлом, что увеличивает размер кода. Тем не менее, в некоторых случаях полезно включать в объявление тело метода. Одна из причин заключается в том, что компилятор попытается встроить методы, включенные в объявление класса; поэтому, если встречается очень короткий однострочный метод, компилятор может ускорить его встраивание, включив тело вместе с объявлением. Кроме того, если встречается шаблонный класс или метод, тогда весь код должен быть включен в объявление, поскольку только с помощью кода можно создать экземпляр шаблона.
  34. ^ Jump up to: а б Просто назначьте ему функцию в методе
  35. ^ Альтернативная реализация:
    def bar():
        doc = "The bar property."
        def fget(self):
            return self._bar
        def fset(self, value):
            self._bar = value
        return locals()
    bar = property(**bar())
    
  36. ^ для этих примеров требуется Class::Accessor. установленный модуль
  37. ^ Jump up to: а б с Хотя Eiffel не поддерживает перегрузку операторов, он может определять операторы
  38. ^ PHP не поддерживает перегрузку операторов изначально, но поддержку можно добавить с помощью пакета PECL «operator» .
  39. ^ Класс должен реализовывать интерфейс ArrayAccess .
  40. ^ Класс должен перегрузить '@{}' (разыменование массива) или создать подкласс одного из Tie::Array или Tie::StdArray для перехвата операций с массивом.
  41. ^ Jump up to: а б В ABAP аргументы должны передаваться с использованием следующего синтаксиса:
    x->method(«exporting parameter = argument» «importing parameter = argument» «changing parameter = argument» «returning value(parameter)»
    parameter = argument можно повторить, если имеется несколько параметров
  42. ^ В C++ нет ключевого слова «super», поскольку возможно множественное наследование, и поэтому может быть неоднозначно, на какой базовый класс ссылаются. Вместо этого BaseClassName::member синтаксис можно использовать для доступа к переопределенному члену в указанном базовом классе. Microsoft Visual C++ предоставляет для этой цели нестандартное ключевое слово «__super»; но это не поддерживается другими компиляторами. [1]
  43. ^ Jump up to: а б с д и ж г час я Ключевое слово здесь не является значением и может использоваться только для доступа к методу суперкласса.
  44. ^ Но бойтесь, они не имеют одинаковой ценности.
  45. ^ только для необязательных типов
  46. ^ Jump up to: а б В этом языке методам экземпляра передается текущий объект в качестве первого параметра, который обычно называется «self», но это не обязательно.
  47. ^ «Предшественник» в Eiffel на самом деле является вызовом одноименного метода в суперклассе. Таким образом, Precursor(args) эквивалентен «super.currentMethodName(args)» в Java. В суперклассе невозможно вызвать метод с другим именем.
  48. ^ «супер» в Ruby, в отличие от других языков, на самом деле является вызовом одноименного метода в суперклассе. Таким образом, super(args) в Ruby эквивалентен «super.currentMethodName(args)» в Java. В суперклассе невозможно вызвать метод с другим именем.
  49. ^ В OCaml объявление объекта может начинаться с параметра, который будет связан с текущим объектом. Этот параметр обычно называется «self», но это не обязательно. Хорошей практикой является размещение там параметра, чтобы можно было вызывать собственные методы.
  50. ^ В OCaml объявление наследования («наследовать») может быть дополнительно связано со значением с помощью синтаксиса « наследовать родительский_класс «параметры» как супер». Здесь «супер» — это имя, присвоенное переменной, связанной с этим родительским объектом. Его можно назвать по-другому.
  51. ^ Однако, если необходима возможность иметь «необязательное» значение в OCaml, оберните это значение внутри option тип, какие значения None и Some x, который можно использовать для представления «нулевой ссылки» и «ненулевой ссылки на объект», как и в других языках.
  52. ^ при условии, что «x» и «y» являются объектами (а не указателями). Можно настроить, перегрузив объект == оператор
  53. ^ Доступно только внутри класса, поскольку clone() метод, унаследованный от Object защищен, если класс не переопределяет метод и не делает его общедоступным. Если использовать clone() унаследовано от Object, класс должен реализовать Cloneable интерфейс, позволяющий клонировать.
  54. ^ Класс должен реализовывать интерфейс Comparable чтобы этот метод был стандартизирован.
  55. ^ Реализовано объектом copyWithZone: метод
  56. ^ compare: — общепринятое название метода сравнения в базовых классах. Однако формального протокола не существует.
  57. ^ Только если объект соответствует Printable протокол
  58. ^ Только если объект соответствует DebugPrintable протокол
  59. ^ Только если объект соответствует Equatable протокол
  60. ^ Только если объект соответствует Comparable протокол
  61. ^ Только если объект соответствует hashValue протокол
  62. ^ Может быть настроена объектом __str__() метод
  63. ^ Может быть настроена объектом __repr__() метод
  64. ^ Может быть настроена объектом __copy__() метод
  65. ^ Может быть настроена объектом __eq__() метод
  66. ^ Только в Python 2.x и более ранних версиях (удалено в Python 3.0). Может быть настроен объектом __cmp__() метод
  67. ^ Может быть настроена объектом __hash__() метод. Не все типы хешируются (изменяемые типы обычно не хэшируются)
  68. ^ Может быть настроена объектом __clone() метод
  69. ^ Jump up to: а б Можно настроить, перегрузив оператор преобразования строк объекта.
  70. ^ Этот пример требует использования Data ::Dumper.
  71. ^ Для этого примера требуется использование Storable .
  72. ^ В этом примере требуется использование Scalar ::Util.
  73. ^ Информацию о типах времени выполнения в ABAP можно собрать с помощью различных классов описания, таких как CL_ABAP_CLASSDESCR.
  74. ^ Jump up to: а б с д и В этом языке преобразование неявно. Экземпляр подтипа можно использовать там, где необходим супертип.
  75. ^ Только для объектов, не принадлежащих к классу. Если x это объект класса, [x class] возвращает только x. Метод времени выполнения object_getClass(x) вернет класс x для всех объектов.
  76. ^ Jump up to: а б с Этот язык является динамически типизированным. Приведение типов между типами не требуется.
  77. ^ Этот язык не предоставляет информацию о типах во время выполнения. В этом нет необходимости, поскольку оно статически типизировано и понижающее приведение невозможно.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c92ec98cc86b710fc4736d99f3360783__1695718920
URL1:https://arc.ask3.ru/arc/aa/c9/83/c92ec98cc86b710fc4736d99f3360783.html
Заголовок, (Title) документа по адресу, URL1:
Comparison of programming languages (object-oriented programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)