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.
Наследование
Класс может быть унаследован от другого класса. Класс, от которого наследуют, называют
При описании класса его базовый класс указывается в скобках после слова 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 – в этом случае от класса запрещено наследовать.
Переопределение методов
Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово 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;
Наследование конструкторов
Правила наследования конструкторов - достаточно сложные. В разных языках программирования приняты разные решения на этот счет. В частности, в Delphi Object Pascal все конструкторы наследуются. В .NET, напротив, конструкторы не наследуются. Причина такого решения - каждый класс сам должен отвечать за инициализацию своих экземпляров. Единственное исключение в .NET - если класс вовсе не определяет конструкторов, то автоматически генерируется конструктор без параметров, называемый конструктором по умолчанию.