usesGraphABC;
const
n = 8;
sz = 50;
typeChessBoard = class
private
a: array[1..n,1..n] ofboolean;
proceduresetCell(x,y: integer; value: boolean);
begin
ifvalue then
Brush.Color := clWhite
elseBrush.Color := clBlack;
Fillrect((x-1)*sz+1,(y-1)*sz+1,x*sz,y*sz);
a[x,y] := value;
end;
functiongetCell(x,y: integer): boolean;
begin
Result := a[x,y];
end;
public
propertyCells[x,y: integer]: boolean readgetCell writesetCell; default;
end;
varc: ChessBoard := new ChessBoard;
begin
var x,y: integer;
forx:=1 ton do
fory:=1 ton do
c[x,y] := Odd(x+y);
end.
Класс может быть унаследован от другого класса. Класс, от которого наследуют, называют базовым классом ( надклассом , предком ), а класс, который наследуется, называется производным классом ( подклассом , потомком ). При наследовании все поля, методы и свойства базового класса переходят в производный класс, кроме этого, могут быть добавлены новые поля, методы и свойства и переопределены (замещены) старые методы. Конструкторы наследуются по особым правилам, которые рассматриваются здесь.
При описании класса его базовый класс указывается в скобках после слова class.
Например:
type
BaseClass = class
procedurep;
procedureq(r: real);
end;
MyClass = class(BaseClass)
procedurep;
procedurer(i: integer);
end;
В данном примере процедура p переопределяется, а процедура r добавляется в класс MyClass.
Если не указать имя базового класса, то считается, что класс наследуется от класса Object - предка всех классов. Например, BaseClass наследуется от Object.
Переопределение методов при наследовании рассматривается здесь.
Перед словом classможет быть указано ключевое слово final– в этом случае от класса запрещено наследовать.
Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited(англ.- унаследованный). Например:
type
Person = class
privat e
name: string;
age: integer;
public
constructorCreate(nm: string; ag: integer);
begin
name := nm;
age := ag;
end;
procedurePrint;
begin
writeln('Имя: ',name,' Возраст: ',age);
end;
end;
Student = class(Person)
private
course, group: integer;
public
constructorCreate(nm: string; ag,c,gr: integer);
begin
inheritedCreate(nm,ag);
course := c;
group := gr;
end;
procedurePrint;
begin
inheritedPrint;
writeln('Курс: ',course,' Группа: ',group);
end;
end;
Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inheritedPrint. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited.
Правила наследования конструкторов рассматриваются здесь.
Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.
Если в методе вызывается метод базового класса с теми же параметрами, то можно использовать запись inherited, не указывая имя метода и параметры. Например, метод Student.Print можно записать таким образом:
procedurePrint;
begin
inherited;
writeln('Курс: ',course,' Группа: ',group);
end;
Наследование конструкторов
Правила наследования конструкторов - достаточно сложные. В разных языках программирования приняты разные решения на этот счет. В частности, в Delphi Object Pascal все конструкторы наследуются. В .NET, напротив, конструкторы не наследуются. Причина такого решения - каждый класс сам должен отвечать за инициализацию своих экземпляров. Единственное исключение в .NET - если класс вовсе не определяет конструкторов, то автоматически генерируется конструктор без параметров, называемый конструктором по умолчанию.
В PascalABC.NETпринято промежуточное решение. Если класс не определяет конструкторов, то все конструкторы предка автоматически генерируются в потомке, вызывая соответствующие конструкторы предка (можно также говорить, что они наследуются). Если в классе определяются конструкторы, то конструкторы предка не генерируются. Конструктор по умолчанию, если он явно не определен, генерируется автоматически в любом случае и является protected.
Читать дальше