【问题标题】:mixin into every non-abstract subclass in D混入 D 中的每个非抽象子类
【发布时间】:2014-06-16 08:14:27
【问题描述】:

我已经创建了一个框架,每个派生自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);。没有任何情况下我想要一个没有这个 mixin 的子类。

所以通常我最终得到了来自 C++/Qt 的 Q_OBJECT 宏。

由于 D lang 称赞自己非常动态,也许有一种方法可以避免这种重复并自动将该模板混入每个子类中?

所以我的代码完全相同:

class FooAction : Action {

    //custom Foo methods

}

class BarAction : Action {

    //custom Bar methods

}

【问题讨论】:

标签: d template-mixins


【解决方案1】:

没有。有人要求添加这样的功能,但现在还没有,你必须自己做 mixin。

如果您愿意修改 druntime 源代码,您可以接近,然后您可以通过指针从对象访问元对象类型的东西,称为 RTInfo 的功能,但它实际上仍然没有添加类本身的代码(当然,修改 druntime 是一个实际的麻烦)。

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

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多