Руководство пользователя

Mixin-классы
NetTradeX PC
NetTradeX Android
NetTradeX iOS
NetTradeX Mobile
NetTradeX Advisors
Mixin-классы

В языке NTL+ отсутствует множественное наследование, но иногда может понадобиться реализовать идентичный код в нескольких классах. Для того чтобы избежать повторения кода, рекомендуется использовать mixin-классы.

Mixin-классы позволяют объявлять частичную структуру класса, которая будет, впоследствии, включена в другие классы. Mixin-классы не являются типами, поэтому нельзя создавать экземпляры таких классов.

Для объявления mixin-класса необходимо добавить ключевое слово mixin перед class, а после class указать любой, разрешенный в языке, идентификатор, который будет являться именем нового класса.

Когда mixin-класс включается в объявление другого класса, все свойства и методы из mixin-класса автоматически переносятся в основной класс.

Пример 1. Использование метода из mixin-класса

mixin class Mxn
{
    datetime dt;
    void printTime() 
    { 
    	System.Print(""+dt); 
    }
    
}
class Cls : Mxn
{
    void Method()
    {  
      System.Print("Current time");
      printTime();
      // property 'dt' could also be used here as if it were declared in this class
    }
}
int Run()
{
  Cls x;
  x.Method();
  //Mxn a; - it is forbidden to create such an instance 
  return(0);
}

Свойства и методы, которые уже объявлены в основном классе не будут включены заново. Таким образом, mixin-класс может обеспечивать реализацию методов по-умолчанию, которые будут переопределены в других классах, использующих mixin-класс.

Методы mixin-класса будут скомпилированы в контексте основного класса, поэтому mixin-класс может работать со свойствами и методами основного класса, как будто эти методы и свойства объявлены в нем самом.

Пример 2. Переопределение метода из mixin-класса

mixin class Mxn
{
    void X() 
    { 
    	System.Print("Default implementation"); 
    } 
    void Y() 
    { 
    	System.Print("time="+tm); // pay attention that 'tm' is not declared in 'Mxn' but it can be used here 
    }
}
class Cls : Mxn
{
    datetime tm;
    void X() 
    { 
    	System.Print("Overriden behaviour"); // this method will override the method in 'Mxn' class
    }
}
int Run()
{
  Cls a;
  a.X();
  a.Y();
  return(0);
}

Создаваемый класс может использовать несколько mixin-классов, для этого имена mixin-классов указываются через запятую. Обратите внимание, что если производный класс наследует от базового класса и одновременно использует mixin-класс, то методы mixin-класса переопределяют методы базового класса, точно так, как если бы эти методы сразу были реализованы в производном классе. Отличное поведение у свойств классов при совпадении имен: свойства из mixin-классов не включаются в производный класс, и используется свойства из базового класса.

Пример 3. Использование наследования и mixin-класса

class BaseClass
{
    int property = 1;
    void MethodA() 
    { 
    	System.Print("Base class"); 
    }
    
}
mixin class Mxn
{
    int property = 2;
    void MethodA() 
    { 
    	System.Print("Mixin class"); 
    }
}
class Cls : BaseClass, Mxn
{
}
int Run()
{
  Cls a;
  a.MethodA(); // prints Mixin class
  System.Print("a.property="+a.property); // prints '1'
  return(0);
}