Составляющие класса
Поля.
Полями называются инкапсулированные в классе данные. Поля могут быть любого типа, в том числе – классами, например:
Type
TMyClass = class
aIntField: Integer;
aStrField: String;
aObjField: TObject;
…
end;
Каждый объект получает уникальный набор полей, но общий для всех объектов данного класса набор методов и свойств. Фундаментальный принцип инкапсуляции требует обращаться к полям только с помощью методов и свойств класса, однако в Delphi разрешается обращаться к полям и напрямую:
Type
TMyClass = class
FIntField: Integer;
FStrField: String;
…
end;
Var
aObject: TMyClass;
Begin
…
aObject.FIntField := 0;
aObject.FStrField := ‘Строка символов’;
…
end;
Класс-потомок получает все поля всех своих предков и может дополнять их своими, но он не может переопределять их или удалять. Таким образом, чем ниже в дереве иерархии располагается класс, тем больше данных получают в свое расположение его объекты.
Методы
Инкапсулированные в классе процедуры и функции называются методами. Они объявляются так же, как и обычные подпрограммы:
Type
TMyClass = class
function MyFunc(aPar: Integer): Integer;
procedure MyProc;
End;
Доcтуп к методам класса, как и к его полям, возможен с помощью составных имен
Var
aObject: TMyClass;
Begin
…
aObject.MyProc;
…
end;
Как уже говорилось, методы класса могут перекрываться в потомках. Например:
Type
TParentClass = class
procedure DoWork;
End;
…
TChildClass = class (TParentClass)
procedure DoWork;
end;
Потомки обоих классов могут выполнять сходную по названию процедуру DoWork, но, в общем случае, будут это делать по-разному. Такое перекрытие методов называется статическим, так как реализуется компилятором.
Свойства
Свойства – это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, readи write(слова readи writeсчитаются зарезервированными только в контексте объявления свойства). Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Например:
Type
TaClass = class
IntField: Integer;
function GetField: Integer;
procedure SetField(Value: Integer);
property IntegerValue: Integer readGetField
writeSetField;
end;
В контексте программы свойство ведет себя как обычное поле. Например, можно написать такие операторы:
Var
aClass: TaClass;
Value: Integer;
Begin
aClass := TaClass.Create; { Обязательное обращение
к конструктору перед обращением к полю
или свойству!}
aClass.IntegerValue := 0;
…
Value := aClass.IntegerValue;
…
FreeAndNil(aClass); // Удаление ненужного объекта
end;
Более того, возможен и такой оператор присваивания:
aClass.IntField := NewValue;
Разница между этим оператором и оператором, показанным ниже, заключается в том, что при обращении к свойству автоматически подключается метод SetField. в котором могут реализовываться специфичные действия:
aClass.IntegerValue := NewValue;
Еще один пример:
Label1.Caption := 'Строка';
Свойство Caption компонента Label1 вызывает метод SetText, который не только запоминает строку символов во внутренней переменной, но и осуществляет прорисовку метки с новым текстом.
Дата добавления: 2017-01-29; просмотров: 1005;