mixin в каждый неабстрактный подкласс в D
Я создал основу для каждого класса, происходящего от Action
необходимо иметь некоторые магические функции, такие как статические методы и т. д., которые зависят от полей этого класса.
Я использую mixin template
для достижения этой цели:
mixin template ACTION(T:Action){
static string url() {
//in real code this is analysing fields of T class.
return "foo";
}
//some other stuff
}
abstract class Action {
}
class FooAction : Action {
mixin ACTION!(FooAction);
//custom Foo methods
}
class BarAction : Action {
mixin ACTION!(BarAction);
//custom Bar methods
}
Это работает и делает именно то, что мне нужно, однако это не совсем СУХОЙ, поскольку я должен включить mixin ACTION!(Subclass);
в каждом неабстрактном подклассе. Нет ни одного случая, в котором я бы хотел иметь подкласс без этого миксина.
Так что обычно я получал что-то вроде макроса Q_OBJECT из C++/Qt.
Поскольку D lang хвалит себя за то, что он очень динамичный, возможно, есть способ избежать этого повторения и автоматически смешать этот шаблон с каждым подклассом?
Так что мой код, делающий точно так же, может просто выглядеть так:
class FooAction : Action {
//custom Foo methods
}
class BarAction : Action {
//custom Bar methods
}
1 ответ
Нет. Были запросы на добавление такой функции, но сейчас ее нет, вы должны сделать миксин самостоятельно.
Вы можете немного приблизиться, если вы хотите изменить исходный код druntime, затем вы можете сделать мета-объект доступным из объекта через указатель, функцию под названием RTInfo, но она по-прежнему не добавляет код к объекту. Сам класс (и, конечно, изменение druntime - практическая проблема).
Таким образом, ваше текущее решение, вероятно, лучшее, что у вас есть.