Sign in Join
Wiki copytemporary

Class/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Class/ru

OldNewLine
1+Класс является хорошо структурированным [[Type/ru|типом данных]] в Object [[Pascal]] и его диалектах (таких, как Delphi или [[Mode ObjFPC/ru|ObjFPC]]). Классы могут содержать [[Variable/ru|переменные]], конструкторы, деструкторы, [[Function/ru|функции]], [[Procedure/ru|процедуры]] и [[Property/ru|свойства]].
2+
3+Также классы освобождают программиста от необходимости использовать указатели и ссылки. Они автоматически обрабатываются компилятором во время компиляции.
4+
5+Классы могут наследоваться от других классов или быть унаследованными в свою очередь. Любой класс, родительский класс которого не уточнен программистом, автоматически наследуется от TObject, так как он имеет необходимые компоненты для всех классов. Из-за зависимости TObject, в деструкторе любой подкласс должен иметь директиву override. Кроме того, любой из конструкторов вашего класса должен иметь в своем теле оператор inherited. Класс может иметь несколько конструкторов, но только один деструктор.
6+
7+Object Pascal не поддерживает множественное наследование: кроме неявного наследования от TObject классы могут иметь только один родительский класс. Полиморфизм реализован с помощью директив методов. Ниже представлен пример простого объявления класса; давайте разберем его.
8+
9+``` pascal
10+type
11+ TMyClass = class
12+ private
13+ FSomeVar: integer;
14+ public
15+ constructor Create; overload;
16+ constructor Create(Args: array of integer); overload;
17+ destructor Destroy; override;
18+ function GetSomeVar: integer;
19+ procedure SetSomeVar(newvalue: integer);
20+ published
21+ property SomeVar: integer read GetSomeVar write SetSomeVar default 0;
22+ end;
23+```
24+
25+Между [[Keyword/ru|ключевыми словами]] **class** и **end** мы видим объявления членов - переменных и методов. Некоторым методам (функциям и/или процедурам) предшествуют модификаторы области видимости (**private**, **public**, **published**), за ними следуют директивы (**overload**, **override**), а также *странная штука* под названием **property**. Давайте разберем их все.
26+
27+## Пояснения о наследовании
28+
29+В Object Pascal производные классы наследуют все члены базового класса, даже те, которые не перегружены с теми же именами. Например:
30+
31+``` pascal
32+type
33+ // базовый класс
34+ MyClass = class
35+ procedure Proc1;
36+ end;
37+
38+ // производный класс
39+ YourClass = class(MyClass)
40+ procedure Proc1; //такое имя процедуры, как и в классе MyClass
41+ end;
42+
43+var
44+ a: MyClass;
45+ b: YourClass;
46+begin
47+ a := MyClass.Create;
48+ b := YourClass.Create;
49+ a.Proc1; // использует процедуру класса MyClass
50+ b.Proc1; // использует процедуру класса YourClass
51+ MyClass(b).Proc1; // использует процедуру класса MyClass
52+```
53+
54+## Модификаторы области видимости
55+
56+Модификаторы области видимости сообщают компилятору кто может вызывать методы класса:
57+
58+- **private**: член может быть вызван/доступен только с помощью методов данного класса;
59+- **public**: член может быть вызван/доступен из любого другого места программы;
60+- **protected**: член может быть вызван/доступен из других классов в том же модуле и из производных классов, но не из внешних классов.
61+- **published**: переменная опубликована и будет доступна в Инспекторе объектов IDE.
62+
63+Модификаторы области видимости не могут быть изменены в производных классах: члены будут сохранять их видимость (или её отсутствие) всегда и везде.
64+
65+---
66+*From the Free Pascal wiki, page "Class/ru", as it stood on 2020-02-10 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history