Компилятор Делавар. Нововведения в языке. Наследование — различия между версиями

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м
м
 
Строка 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