type
Person = class
private
fName: string;
fAge: integer;
public
constructor Create(Name: string; Age: integer);
begin
fName := Name;
fAge := Age;
end;
procedure Print;
property Name: string read fName;
property Age: integer read fAge;
end;
procedure Person.Print;
begin
writelnFormat('Имя: {0} Возраст: {1}', Name, Age);
end;
После слова class в скобках может быть указано имя класса-предка (см. Наследование), а также через запятую список поддерживаемых интерфейсов.
Перед словом class может быть указано ключевое слово final в этом случае от класса запрещено наследовать.
Все описания и объявления внутри класса образуют
Классы могут описываться только на глобальном уровне. Локальные определения классов (т.е. определения в разделе описания подпрограмм) запрещены.
В языке PascalABC.NET классы являются ссылочными типами. Это значит, что переменная типа класс хранит в действительности ссылку на объект.
Переменные типа класс называются
var p: Person := new Person('Иванов',20);
После инициализации через переменную типа класс можно обращаться к публичным членам класса (полям, методам, свойствам), используя точечную нотацию:
Print(p.Name,p.Age);
p.Print;
По умолчанию процедура write для переменной типа класс выводит содержимое её публичных полей и свойств в круглых скобках через запятую:
write(p); // Иванов 20
Чтобы изменить это поведение, в классе следует переопределить виртуальный метод ToString класса Object - в этом случае именно он будет вызываться при выводе объекта.
Например:
type
Person = class
...
function ToString: string; override;
begin
Result := string.Format('Имя: {0} Возраст: {1}', Name, Age);
end;
end;
...
var p: Person := new Person('Иванов',20);
writeln(p); // Имя: Иванов Возраст: 20
Переменная типа класс является ссылкой и хранит ссылку на объект, создаваемый вызовом конструктора.
Как ссылка переменная типа класс может хранить значение nil:
p := nil;
...
if p = nil then ...
При присваивании переменных типа класс копируется только ссылка. После присваивания обе переменные типа класс будут ссылаться на один объект и совместно модифицировать его:
var p1,p2: Person;
...
p1 := new Person('Петров',20);
p2 := p1;
p1.IncAge;
p2.Print; // Имя: Петров Возраст: 21
При сравнении переменных типа класс на равенство сравниваются ссылки, а не значения.
var p1 := new Person('Петров',20);
var p2 := new Person('Петров',20);
writeln(p1=p2); // False
p2 := p1;
writeln(p1=p2); // True
Это поведение можно изменить, перегрузив операцию = для класса.
Видимость членов класса и модификаторы доступа
Каждое поле, метод или свойство класса имеет модификатор (атрибут) доступа, задающий правила его видимости. В PascalABC.NET существуют четыре вида модификаторов доступа: public (открытый), private (закрытый), protected (защищенный) и internal (внутренний). К члену класса, имеющему атрибут public, можно обратиться из любого места программы, члены класса с атрибутом private доступны только внутри методов этого класса, члены класса с атрибутом protected доступны внутри методов этого класса и всех его подклассов, члены класса с атрибутом internal доступны внутри сборки (термин .NET, сборка в нашем понимании - это множество файлов, необходимых для генерации .exe или .dll-файла). Кроме того, private и protected члены видны отовсюду в пределах модуля, в котором определен класс.