mixin到D中的每个非抽象子类

时间:2014-06-16 08:14:27

标签: d template-mixins

我已经创建了一个框架,每个类派生自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

}

这很有效,并且正在完全按照我的需要进行操作,但它并不完全是DRY,因为我必须在每个非抽象子类中包含mixin ACTION!(Subclass);。如果没有这个混合,我就不希望有一个子类。

所以一般来说我最终得到了像C ++ / Qt的Q_OBJECT宏。

由于D lang称赞自己非常有活力,也许有办法避免这种重复,并将这个模板自动混合到每个子类中?

所以我的代码完全相同可能看起来像:

class FooAction : Action {

    //custom Foo methods

}

class BarAction : Action {

    //custom Bar methods

}

1 个答案:

答案 0 :(得分:2)

没有。已经要求添加这样的功能,但现在还没有,你必须自己做混音。

如果你愿意修改druntime源代码,你可以得到一些关闭,那么你可以通过指针,一个名为RTInfo的功能,从对象中获取一个元对象,但它仍然没有实际上将代码添加到类本身(当然,修改druntime是一个实际的麻烦)。

因此,您当前的解决方案可能是您拥有的最佳解决方案。