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

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