Қасиеттер, өріс сияқты кластың атрибуты болып саналады. Қасиеттер сырт көрінісімен кластың өрісін еске түсіреді, бірақ шынында ол өрістерге қатынасты реттейтін механизм болып табылады. Объектінің қасиеттері мыналармен сипатталады:
-
оның қасиеттің мәнін сақтайтын кластың өрісімен байланысы;
-
қасиеттің өрісіне қатынауды қамтамасыз ететін екі әдіс:
-
қасиеттің мәнін тағайындайтын әдіс қасиетті жазу әдісі (write) деп аталады.
-
қасиеттің мәнін алатын әдісті қасиетті оқу әдісі (read) деп атаймыз.
Қасиетті property, read және write сөздерінің көмегімен жариялайды. Read және write сөздері әдістердің аттарынан тұратын бөлімнің басын білдіреді, олар сәйкес оқу мен жазуға тағайындалған. Қасиеттің синтаксисі мынандай:
property propertyName[indexes]: type index integerConstant specifiers;
мұндағы propertyName – қасиеттің аты, кез – келген дұрыс идентификатор; [indexes] – [имя1, имя2, ... , имяN: type] формасындағы ат - параметрі; type – қасиеттің типі, ол құрамдас немесе алдын – ала типтерді жариялау бөлімінде жариялануы қажет; index integerConstant – бүтін санды тұрақты шама, міндетті емес параметр, ол бірнеше қасиеттерге әртүрлі мәндерді көрсетуде сол бір әдісті қолдануға мүмкіндік береді (мысал 2.6.2); read, write, stored, default (немесе nodefault) және implements – спецификаторлары (specifiers).
Мысал 2.6.1 Object Pascal - да анықталған қасиеттерге мысалдар.
property Objects[Index: Integer]: TObject read GetObject
write SetObject;
property Pixels[X, Y: Integer]: TColor read GetPixel
write SetPixel;
property Values[const Name: string]: string read GetValue
write SetValue;
property ErrorCount: Integer read GetErrorCount;
property NativeError: Longint read FNativeError;
Мысал 2.6.2 Index спецификаторы бар қасиетке мысал.
type
TRectangle = class
private
FCoordinates: array[0..3] of Longint;
function GetCoordinate(Index: Integer): Longint;
procedure SetCoordinate(Index: Integer; Value: Longint);
public
property Left: Longint index 0 read GetCoordinate
write SetCoordinate;
property Top: Longint index 1 read GetCoordinate
write SetCoordinate;
property Right: Longint index 2 read GetCoordinate
write SetCoordinate;
property Bottom: Longint index 3 read GetCoordinate
write SetCoordinate;
property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate;
...
end;
Index спецификаторы бар қасиетте қатынау әдісі бүтін типті қосымша параметрді алуы керек. Оқу функциясы үшін ол жалғыз параметр, жазба процедурасы үшін ол соңғы параметрдің алдындағы (қасиеттің мәнін анықтайтын алдыңғы параметрге сай) параметр болуы керек. Бағдарлама қасиетке қатынағанда, бүтін санды тұрақты шама қасиет автоматты түрде қатынау әдісіне беріледі.
Егер Rectangle TRectangle типті болса, жоғарыда жарияланғандай, онда
Rectangle.Right := Rectangle.Left + 10;
мынадай сәйкестік орын алады:
Rectangle.SetCoordinate(2, Rectangle.GetCoordinate(0) + 100);
Қасиеттердің барлық жариялануында read және write спецификаторларының біреуі немесе екеуін бірақ болуы қажет. Олар қатынас спецификаторы деп аталады және келесі формада жазылады:
read fieldOrMethod
write fieldOrMethod
мұндағы fieldOrMethod – қасиет жарияланған класта немесе арғы – тек класында жарияланған өріс немесе әдістің аты.
Егер fieldOrMethod қасиет жарияланған класта жарияланса, ол қасиетті жарияламас бұрын орындалуы қажет.
Егер fieldOrMethod арғы – тек класында жарияланса, онда ол ұрпақта көрінуі тиіс, яғни басқа модульде жарияланған жеке өріс немесе ұрпақ кластың әдісі болмауы тиіс.
Егер fieldOrMethod - өріс болса, онда ол қасиеттің типінен тұруы керек.
Если fieldOrMethod - әдіс болса, онда оны қайта анықтауға болмайды.
Если fieldOrMethod - read спецификаторында анықталған әдіс болса, онда ол қасиеттің типіне сай келетін мәнді қайтаратын параметрі жоқ функция болуы керек. Оқуға арналған функцияның аты соңынан қасиеттің аты жазылатын Get приставкасынан басталады.
Егер fieldOrMethod - write спецификаторында анықталған әдіс болса, онда ол бір ғана параметрден тұратын процедура болуы тиіс. Бұл параметрдің типі қасиеттің типіне сай келуі тиіс. Жазуға тағайындалған процедураның аты соңынан қасиеттің аты жазылатын Set приставкасынан басталады.
Мысалы, егер қасиет жарияланған болса:
property Color: TColor read GetColor write SetColor;
онда GetColor әдісі мыналай сипатталуы қажет
function GetColor: TColor;
және SetColor әдісі мыналай сипатталуы
procedure SetColor(Value: TColor);
немесе
procedure SetColor(const Value: TColor);
сипатталынуы керек.
Егер қасиет тек read спецификатрынан тұратын болса, онда ол "read only" (тек оқуға ғана) атрибутынан тұрады. Егер қасиет тек write спецификатрынан тұратын болса, онда ол "write only" (тек жазуға ғана) атрибутынан тұрады. Қасиеттің мәніне тек оқуға ғана тағайындалған мәнді меншіктеу немесе қасиеттің өрнегінде тек жазуға ғана арналған мәнді қолдану компиляция уақытының қатесін шақырады. Жазудан қорғалған қасиетке мәнді объектіні инициализациялау кезінде орнатуға болады.
Мысал 2.6.3 Name және Address екі қасиеттерден тұратын Name және Address TPerson класын сипаттау.
type
TName = string[15];
TAddress = string[35];
TPerson = class // класты жариялау
private
FName: TName; // Name қасиетінің мәні
FAddress: TAddress; // Address қасиетінің мәні
protected
constructor Create(Name: TName);
procedure Show;
function GetName: TName;
function GetAddress: TAddress;
procedure SetAddress(NewAddress: TAddress);
public
property Name: TName // Name қасиеті
read GetName; // тек оқуға ғана мүмкіндік бар
property Address: TAddress // Address қасиеті
read GetAddress // оқуға және жазуға мүмкіндік бар
write SetAddress;
end;
Мұндағы Name – FName өрісімен байланысқан қасиет, GetName – FName өрісінен оқуға тағайындалған әдіс. Address – FAddress өрісімен байланысқан қасиет, GetAddress және SetAddress – сәйкес FAddress өрісіне оқуға және жазуға тағайындалған әдіс.
Төменде TPerson класының объектілерін құруға және оның қасиеттеріне қатынауды қамтамасыз ететін TPerson класының әдістері келтірілген.
constructor TPerson.Create(Name: TName); // TPerson класының конструкторы
begin
FName := Name;
end;
function TPerson.GetName; // Name қасиетінің мәнін алатын әдіс
begin
Result := FName;
end;
function TPerson.GetAddress; // Address қасиетінің мәнін алатын әдіс
begin
Result := FAddress;
end;
// Address қасиетінің мәнін өзгертетін әдіс
procedure TPerson.SetAddress(NewAddress: TAddress);
begin
If FAddress = ’’ then FAddress := NewAddress;
end;
Қасиетке қатынау үшін бағдарламаның мәтінінде өрістер мен әдістердегі сияқты объектінің атынан, нүктеден және қасиеттің атынан тұратын құрамды атты қолдану керек, мысалы:
var
Student : TPerson // кластың айнымалысын жариялау
HisAddress : String;
begin
Student := TPerson.Create(’Иванов’);
Student.Address := ’ул. Садовая, д.3, кв.25’;
...
HisAddress := Student.Address;
...
Student.Free;
end;
Address қасиетіне мән меншіктеу нұсқасын орындағанда компилятор әдісті шақыру нұсқасында оны қайта трансляциялайды.
Student.SetAddress(’ул. Садовая, д.3, кв.25’);
Сырт жағынан қарағанда бағдарламада қасиетті қолданудың объектінің өрісін қолданудан еш айырмашылығы жоқ. Бірақ қасиет пен объектінің өрісінің арасында принциптік айырмашылық бар: қасиетке мән меншіктегенде және оның мәнін оқығанда қандай да бір жұмысты атқаратын процедура автоматты түрде шақырылады. Мысалы, біз FAddress өрісіне тікелей керекті мәнді орналастыра аламыз
Student.FAddress := ’ул. Садовая, д.3, кв.25’;
Бірақ, Address қасиетін қолдана отырып біз тек оқу мен жазуға тағайындалған әдістерге әртүрлі әрекет жасай аламыз: қасиетке меншіктелген мәннің корректілігін тексеру, экранға хабарламаның шығуын қамтамасыз ету, экрандағы объектінің сырт көрінісін өзгерту және т.б. Егер жазу немесе оқу кезінде қосымша әрекеттердің қажеттігі тумаса, онда сәйкес әдістің орнына өрістің атын нұсқау қажет:
type
TPerson = class
FAddress: TAddress;
procedure SetAddress(NewAddress: TAddress);
property Address: TAddress read FAddress write SetAddress;
end;
Қасиет нақты бір өріспен байланыспауы да мүмкін. Бұл жағдайда қасиетте қасиеттің типіне сай келетін берілгендермен әрекет жасау үшін екі әдіс анықталады.
Достарыңызбен бөлісу: |