Difference between revisions of "Class/ru"

From Lazarus wiki
Jump to navigationJump to search
m (categories)
m (Fixed syntax highlighting)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
{{Class}}
 
{{Class}}
  
Класс является хорошо структурированным типом данных в Object Pascal и его диалектах (таких, как Delphi или ObjFPC). Классы могут содержать переменные, конструкторы, деструкторы, функции, процедуры и свойства.
+
Класс является хорошо структурированным [[Type/ru|типом данных]] в Object [[Pascal]] и его диалектах (таких, как Delphi или [[Mode ObjFPC/ru|ObjFPC]]). Классы могут содержать [[Variable/ru|переменные]], конструкторы, деструкторы, [[Function/ru|функции]], [[Procedure/ru|процедуры]] и [[Property/ru|свойства]].
  
 
Также классы освобождают программиста от необходимости использовать указатели и ссылки. Они автоматически обрабатываются компилятором во время компиляции.
 
Также классы освобождают программиста от необходимости использовать указатели и ссылки. Они автоматически обрабатываются компилятором во время компиляции.
  
Классы могут наследоваться от других классов или быть унаследованными в свою очередь. Любой класс, родительский класс которого не уточнен программистом,  автоматически наследуется от TObject, так как он имеет необходимые компоненты для всех классов. Из-за зависимости TObject, в деструкторе любой подкласс должен иметь директиву override. Кроме того, любой из конструкторов вашего класса должен иметь в совем теле оператор inherited. Класс может иметь несколько конструкторов, но только один деструктор.
+
Классы могут наследоваться от других классов или быть унаследованными в свою очередь. Любой класс, родительский класс которого не уточнен программистом,  автоматически наследуется от TObject, так как он имеет необходимые компоненты для всех классов. Из-за зависимости TObject, в деструкторе любой подкласс должен иметь директиву override. Кроме того, любой из конструкторов вашего класса должен иметь в своем теле оператор inherited. Класс может иметь несколько конструкторов, но только один деструктор.
  
 +
Object Pascal не поддерживает множественное наследование: кроме неявного наследования от TObject классы могут иметь только один родительский класс. Полиморфизм реализован с помощью директив методов. Ниже представлен пример простого объявления класса; давайте разберем его.
  
{{AutoCategory}}
+
<syntaxhighlight lang="pascal">
[[Category:Data types/ru]]
+
type
 +
  TMyClass = class
 +
  private
 +
    FSomeVar: integer;
 +
  public
 +
    constructor Create; overload;
 +
    constructor Create(Args: array of integer); overload;
 +
    destructor Destroy; override;
 +
    function GetSomeVar: integer;
 +
    procedure SetSomeVar(newvalue: integer);
 +
  published
 +
    property SomeVar: integer read GetSomeVar write SetSomeVar default 0;
 +
  end;
 +
</syntaxhighlight>
 +
 
 +
Между [[Keyword/ru|ключевыми словами]] '''class''' и '''end''' мы видим объявления членов - переменных и методов. Некоторым методам (функциям и/или процедурам) предшествуют модификаторы области видимости ('''private''', '''public''', '''published'''), за ними следуют директивы ('''overload''', '''override'''), а также ''странная штука'' под названием '''property'''. Давайте разберем их все.
 +
 
 +
 
 +
__TOC__
 +
== Пояснения о наследовании ==
 +
В Object Pascal производные классы наследуют все члены базового класса, даже те, которые не перегружены с теми же именами. Например:
 +
 
 +
<syntaxhighlight lang="pascal">
 +
type
 +
  // базовый класс
 +
  MyClass = class
 +
    procedure Proc1; 
 +
  end;
 +
 
 +
  // производный класс
 +
  YourClass = class(MyClass) 
 +
    procedure Proc1; //такое имя процедуры, как и в классе MyClass
 +
  end;
 +
 
 +
var
 +
  a: MyClass;
 +
  b: YourClass;
 +
begin
 +
  a := MyClass.Create;
 +
  b := YourClass.Create;
 +
  a.Proc1;          // использует процедуру класса MyClass
 +
  b.Proc1;          // использует процедуру класса YourClass
 +
  MyClass(b).Proc1; // использует процедуру класса MyClass
 +
</syntaxhighlight>
 +
 
 +
 
 +
== Модификаторы области видимости ==
 +
 
 +
Модификаторы области видимости сообщают компилятору кто может вызывать методы класса:
 +
* '''private''': член может быть вызван/доступен только с помощью методов данного класса;
 +
* '''public''':  член может быть вызван/доступен из любого другого места программы;
 +
* '''protected''': член может быть вызван/доступен из других классов в том же модуле и из производных классов, но не из внешних классов.
 +
* '''published''': переменная опубликована и будет доступна в Инспекторе объектов IDE.
 +
 
 +
Модификаторы области видимости не могут быть изменены в производных классах: члены будут сохранять их видимость (или её отсутствие) всегда и везде.
 +
 
 +
 
 +
{{Data types/ru}}

Latest revision as of 00:29, 11 February 2020

Deutsch (de) English (en) français (fr) русский (ru)

Класс является хорошо структурированным типом данных в Object Pascal и его диалектах (таких, как Delphi или ObjFPC). Классы могут содержать переменные, конструкторы, деструкторы, функции, процедуры и свойства.

Также классы освобождают программиста от необходимости использовать указатели и ссылки. Они автоматически обрабатываются компилятором во время компиляции.

Классы могут наследоваться от других классов или быть унаследованными в свою очередь. Любой класс, родительский класс которого не уточнен программистом, автоматически наследуется от TObject, так как он имеет необходимые компоненты для всех классов. Из-за зависимости TObject, в деструкторе любой подкласс должен иметь директиву override. Кроме того, любой из конструкторов вашего класса должен иметь в своем теле оператор inherited. Класс может иметь несколько конструкторов, но только один деструктор.

Object Pascal не поддерживает множественное наследование: кроме неявного наследования от TObject классы могут иметь только один родительский класс. Полиморфизм реализован с помощью директив методов. Ниже представлен пример простого объявления класса; давайте разберем его.

type
  TMyClass = class
  private
    FSomeVar: integer;
  public
    constructor Create; overload;
    constructor Create(Args: array of integer); overload;
    destructor Destroy; override;
    function GetSomeVar: integer;
    procedure SetSomeVar(newvalue: integer);
  published
    property SomeVar: integer read GetSomeVar write SetSomeVar default 0;
  end;

Между ключевыми словами class и end мы видим объявления членов - переменных и методов. Некоторым методам (функциям и/или процедурам) предшествуют модификаторы области видимости (private, public, published), за ними следуют директивы (overload, override), а также странная штука под названием property. Давайте разберем их все.


Пояснения о наследовании

В Object Pascal производные классы наследуют все члены базового класса, даже те, которые не перегружены с теми же именами. Например:

type
  // базовый класс
  MyClass = class
    procedure Proc1;   
  end;

  // производный класс
  YourClass = class(MyClass)  
    procedure Proc1; //такое имя процедуры, как и в классе MyClass
  end;

var
  a: MyClass;
  b: YourClass;
begin
  a := MyClass.Create;
  b := YourClass.Create;
  a.Proc1;          // использует процедуру класса MyClass 
  b.Proc1;          // использует процедуру класса YourClass
  MyClass(b).Proc1; // использует процедуру класса MyClass


Модификаторы области видимости

Модификаторы области видимости сообщают компилятору кто может вызывать методы класса:

  • private: член может быть вызван/доступен только с помощью методов данного класса;
  • public: член может быть вызван/доступен из любого другого места программы;
  • protected: член может быть вызван/доступен из других классов в том же модуле и из производных классов, но не из внешних классов.
  • published: переменная опубликована и будет доступна в Инспекторе объектов IDE.

Модификаторы области видимости не могут быть изменены в производных классах: члены будут сохранять их видимость (или её отсутствие) всегда и везде.


Типы данных
Простые типы Boolean | Byte | Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word
Сложные типы Array | Class | Record | Set | String | Shortstring