uses GraphABC;

const

n = 8;

sz = 50;

type ChessBoard = class

private

a: array [1..n,1..n] of boolean;

procedure setCell(x,y: integer; value: boolean);

begin

if value then

Brush.Color := clWhite

else Brush.Color := clBlack;

Fillrect((x-1)*sz+1,(y-1)*sz+1,x*sz,y*sz);

a[x,y] := value;

end;

function getCell(x,y: integer): boolean;

begin

Result := a[x,y];

end;

public

property Cells[x,y: integer]: boolean read getCell write setCell; default;

end;

var c: ChessBoard := new ChessBoard;

begin

var x,y: integer;

for x:=1 to n do

for y:=1 to n do

c[x,y] := Odd(x+y);

end.

<p>Наследование</p>

Класс может быть унаследован от другого класса. Класс, от которого наследуют, называют базовым классом (надклассом, предком), а класс, который наследуется, называется производным классом (подклассом, потомком). При наследовании все поля, методы и свойства базового класса переходят в производный класс, кроме этого, могут быть добавлены новые поля, методы и свойства и переопределены (замещены) старые методы. Конструкторы наследуются по особым правилам, которые рассматриваются здесь.

При описании класса его базовый класс указывается в скобках после слова class.

Например:

type

BaseClass = class

procedure p;

procedure q(r: real);

end;

MyClass = class(BaseClass)

procedure p;

procedure r(i: integer);

end;

В данном примере процедура p переопределяется, а процедура r добавляется в класс MyClass.

Если не указать имя базового класса, то считается, что класс наследуется от класса Object - предка всех классов. Например, BaseClass наследуется от Object.

Переопределение методов при наследовании рассматривается здесь.

Перед словом class может быть указано ключевое слово final – в этом случае от класса запрещено наследовать.

<p>Переопределение методов</p>

Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited (англ.- унаследованный). Например:

type

Person = class

private

name: string;

age: integer;

public

constructor Create(nm: string; ag: integer);

begin

name := nm;

age := ag;

end;

procedure Print;

begin

writeln('Имя: ',name,' Возраст: ',age);

end;

end;

Student = class(Person)

private

course, group: integer;

public

constructor Create(nm: string; ag,c,gr: integer);

begin

inherited Create(nm,ag);

course := c;

group := gr;

end;

procedure Print;

begin

inherited Print;

writeln('Курс: ',course,' Группа: ',group);

end;

end;

Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inherited Print. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited.

Правила наследования конструкторов рассматриваются здесь.

Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.

Если в методе вызывается метод базового класса с теми же параметрами, то можно использовать запись inherited, не указывая имя метода и параметры. Например, метод Student.Print можно записать таким образом:

procedure Print;

begin

inherited;

writeln('Курс: ',course,' Группа: ',group);

end;

<p>Наследование конструкторов</p>

Правила наследования конструкторов - достаточно сложные. В разных языках программирования приняты разные решения на этот счет. В частности, в Delphi Object Pascal все конструкторы наследуются. В .NET, напротив, конструкторы не наследуются. Причина такого решения - каждый класс сам должен отвечать за инициализацию своих экземпляров. Единственное исключение в .NET - если класс вовсе не определяет конструкторов, то автоматически генерируется конструктор без параметров, называемый конструктором по умолчанию.

Перейти на страницу:

Похожие книги