1

標準の mixin とは少し異なることを実現したいと考えています。拡張するクラス (またはトレイト) のフィールドに基づいて新しいフィールドが計算されるトレイトを構築したいと考えています。

たとえば、次のようなクラスがあるとします。

class Point {
    var x: Int = 0
    var y: Int = 0
}

そして、私はこのようなクラスを作りたかった:

class Point' {
    var x: Int = 0
    var y: Int = 0
    var myx: Int = 0
    var myy: Int = 0
}

myxフィールド名を計算し、myyそれらを特性を使用してクラスに混合する関数を記述できるようにしたいと考えています。ここに私がやりたいことのために作られた疑似Scalaがあります:

def addMy(cls: Class) {
    newFields = cls.fields.map( f => createField("my" + f.name, f.type) )
    myTrait = createTrait(newFields)
    extendClass(cls, myTrait)
}
4

1 に答える 1

0

このような動作を実現するために私が考える最も簡単な方法は、Scala 2.10 のDynamic機能を使用することです。したがって、Point拡張する必要があり、計算ロジックをメンバー関数およびDynamicに追加することにより、任意のフィールドを「混在させる」ことができます。これは「ミックスイン」が実際に言及しているものとは異なりますが、それでも機能を動的に追加できます。selectDynamicupdateDynamic

特定の機能が混在しているかどうかを確認できるようにするために、たとえば次の規則を使用できます。フィールドが混在しているかどうかを確認するために、ユーザーはhasMyxまたはhas...一般的に呼び出すことができます。デフォルトでは、実装は を返しますfalse。新しいフィールドを混合するたびに、対応するhas...関数は を返しtrueます。

すべての混合フィールドの戻り値の型は になることに注意してくださいAny(すべてのフィールドが同じ型でない限り、たとえば、この質問を参照してください)。私は現在、このデザインで多くのキャスティングを避ける方法を見つけていません。

于 2013-02-20T08:56:37.760 に答える