img

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); }