Компилятор Делавар. Нововведения в языке. Наследование — различия между версиями
Админ (обсуждение | вклад) (Новая страница: « == См. также == * Компилятор Делавар Категория:Компилятор Делавар Категория:Ubuntu {{i}}») |
Дизайнер (обсуждение | вклад) м |
||
Строка 1: | Строка 1: | ||
+ | '''Нововведения в языке. Наследование''' | ||
+ | В версии компилятора 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. | ||
== См. также == | == См. также == |
Версия 21:51, 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