Компилятор Делавар. Нововведения в языке. Наследование — различия между версиями
Дизайнер (обсуждение | вклад) м |
Дизайнер (обсуждение | вклад) м |
||
Строка 7: | Строка 7: | ||
{ | { | ||
string name; | string name; | ||
− | |||
Figure () | Figure () | ||
{ | { | ||
name = "Figure"; | name = "Figure"; | ||
} | } | ||
− | |||
virtual void ToString () | virtual void ToString () | ||
{ | { | ||
printf ( "my name is '%s'\n", name ); | printf ( "my name is '%s'\n", name ); | ||
} | } | ||
− | |||
virtual ~Figure () | virtual ~Figure () | ||
{ | { | ||
Строка 42: | Строка 39: | ||
string etype; | string etype; | ||
string name; | string name; | ||
− | |||
employee () | employee () | ||
{ | { | ||
Строка 48: | Строка 44: | ||
name = (string) NULL; | name = (string) NULL; | ||
} | } | ||
− | |||
void ToString () | void ToString () | ||
{ | { | ||
Строка 58: | Строка 53: | ||
{ | { | ||
int bonus; | int bonus; | ||
− | |||
manager () | manager () | ||
{ | { | ||
Строка 65: | Строка 59: | ||
bonus = 0; | bonus = 0; | ||
} | } | ||
− | |||
void ToString () | void ToString () | ||
{ | { |
Текущая версия на 21:52, 13 января 2016
Нововведения в языке. Наследование
В версии компилятора 0.59 введена возможность простого наследования классов и типов, т.е. один класс (тип) может иметь один класс(тип)-предок. На данный момент, реализовано это следующим образом: ссылочный тип может унаследовать только ссылочный тип, а значимый тип - только значимый тип.
Для указания класса-предка необходимо после имени производного класса ввести через двоеточие имя базового класса. В качестве примера построим небольшую иерархию классов:
class Figure { string name; Figure () { name = "Figure"; } virtual void ToString () { printf ( "my name is '%s'\n", name ); } virtual ~Figure () { printf ( "call destructor '%s'\n", name ); } }
class Dot : Figure { int x, y;
Dot () { name = "Dot"; x = 0; y = 0; } }
Здесь класс Dot наследует класс Figure и все его свойства, таким образом из производного класса можно обращаться к поля и методам наследуемого класса. Если в производном классе объявляется поле или метод с одноименным именем в базовом классе, то такое поле или метод базового класса будут перекрыты. В этом случае, компилятор будет использовать одноименные поля и методы производного класса. Для обращения к перекрытым полям и методам базового класса используется ключевое слово base. Рассмотрим следующий пример:
class employee { string etype; string name; employee () { etype = "employee"; name = (string) NULL; } void ToString () { printf ( "I'm %s %s\n", etype, name ); } }
class manager : employee { int bonus; manager () { employee (); etype = "manager"; bonus = 0; } void ToString () { base.ToString (); printf ( "My bonus: %d\n", bonus ); } }
Здесь метод ToString () базового класса Employee перекрыт одноименным методом из производного класса Manager. Метод ToString () производного класса использует функционал перекрытого метода базового класса, обращаясь к нему с помощью ключевого слова base.
В версии 0.62 компилятора Делавар появилась возможность использовать виртуальные методы в пользовательских типах. Для объявления виртуального метода предназначено ключевое слово virtual, указанное в начале определения метода, как это сделано для метода ToString класса Figure. Объявить виртуальным можно также деструктор (см. класс Figure). Также стало возможным приведение производного класса к базовому классу. Доработан вызов конструктора и деструктора по умолчанию при создании и соответственно удалении экземпляра пользовательского типа: вызываются конструкторы и деструкторы всех базовых классов, если имеются.
Примеры программ с использованием наследования находятся в каталоге DC32\EX\INHERIT.
См. также
Яндекс | Картинки | Видео | Карты | Карты ОСМ | Спутник | Гугл | Вольфрам-Альфа | РуВики | EnWiki