Difference between revisions of "Class/ru"
Softforwinxp (talk | contribs) (Created page with "Класс является хорошо структурированным типом данных в Object Pascal и его диалектах (таких, как Delphi и...") |
m (Fixed syntax highlighting) |
||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | Класс является хорошо структурированным типом данных в Object Pascal и его диалектах (таких, как Delphi или ObjFPC). Классы могут содержать переменные, конструкторы, деструкторы, функции, процедуры и свойства. | + | {{Class}} |
+ | |||
+ | Класс является хорошо структурированным [[Type/ru|типом данных]] в Object [[Pascal]] и его диалектах (таких, как Delphi или [[Mode ObjFPC/ru|ObjFPC]]). Классы могут содержать [[Variable/ru|переменные]], конструкторы, деструкторы, [[Function/ru|функции]], [[Procedure/ru|процедуры]] и [[Property/ru|свойства]]. | ||
Также классы освобождают программиста от необходимости использовать указатели и ссылки. Они автоматически обрабатываются компилятором во время компиляции. | Также классы освобождают программиста от необходимости использовать указатели и ссылки. Они автоматически обрабатываются компилятором во время компиляции. | ||
− | Классы могут наследоваться от других классов или быть унаследованными в свою очередь. Любой класс, родительский класс которого не уточнен программистом, автоматически наследуется от TObject, так как он имеет необходимые компоненты для всех классов. Из-за зависимости TObject, в деструкторе любой подкласс должен иметь директиву override. Кроме того, любой из конструкторов вашего класса должен иметь в | + | Классы могут наследоваться от других классов или быть унаследованными в свою очередь. Любой класс, родительский класс которого не уточнен программистом, автоматически наследуется от TObject, так как он имеет необходимые компоненты для всех классов. Из-за зависимости TObject, в деструкторе любой подкласс должен иметь директиву override. Кроме того, любой из конструкторов вашего класса должен иметь в своем теле оператор inherited. Класс может иметь несколько конструкторов, но только один деструктор. |
+ | |||
+ | Object Pascal не поддерживает множественное наследование: кроме неявного наследования от TObject классы могут иметь только один родительский класс. Полиморфизм реализован с помощью директив методов. Ниже представлен пример простого объявления класса; давайте разберем его. | ||
+ | |||
+ | <syntaxhighlight lang="pascal"> | ||
+ | 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 |