2017-09-12 21 views
2

私は、受け入れるべき型を動的にしたいが、依然として浮動小数点型のクラスを持っています。私は以下のクラスの例を追加しました。簡単に言えば、IntsまたはFloats(または抄録(Float))のいずれかを含むクラスが必要ですが、typeパラメータには実際にフィットするものが割り当てられていないことがあります。Tにデフォルト値を代入する:浮動小数点型パラメータ

class Container<T:Float> 
{ 
    public function new(aValue:T = 0.0) 
    { 
    } 

    public function example():T 
    { 
     return 16.0; 
    } 

この例では、2つのコンパイラエラーが発生します。最初のものは、コンストラクタnew(aValue:T = 0.0のデフォルト値です。単純な修正は、値を動的に設定することですが、私はこれよりも綺麗なコードを好きです。 2番目のエラーはexample()の戻り値にあります。 Tインスタンスではないので、16.0を返すことはできません。

私の質問:これは実行可能ですか、そうでない場合は、すべてのタイプに異なるクラス定義を使用する必要がありますか?

答えて

3

ここで問題になるのは、ジェネリックタイプ「T」が本当に必要ないということです。

ここで私はあなたの制約を考えています。クラス "Container"は汎用ではなく、単なるFloatコンストラクタを含んでいます。ただし、キャストルールを定義している限り、暗黙的にFloatにキャストできる値はすべてabstractですが、これを受け入れることができます。

package ; 

class Main 
{ 
    public static function main() 
    { 
     new Container(); // default 
     new Container(1); // Int 
     new Container(2.3); // Float 
     new Container(new UnifiesWithFloat(4.5)); // Float abstract 
    } 
} 

class Container 
{ 
    public function new(aValue:Float = 0.8) 
    { 
     trace('aValue is $aValue'); 
    } 
} 

abstract UnifiesWithFloat(Float) from Float to Float 
{ 
    inline public function new(value:Float) 
    { 
     this = value; 
    } 
} 
+0

この単純な解決策は、いくつかの状況で非常によく動作しますが、それはフロートからFloat'に '含まれていません抄録のために動作しないでしょう。 浮動小数点型のオーバーロードをサポートする任意の種類の抽象クラスをサポートすることができます。 もちろん、浮動小数点型パラメータに値を代入する方法がない場合は、単純な浮動小数点型のコンテナが最も効率的なソリューションです。 –

+0

待って、シャワーが助けになりました。私の以前のコメントは、厳密には浮動小数点型ではない抽象型としては機能しません。私が本当に必要とするのは、ある型で可能なオペレータのオーバーロードを指定する方法ですが、それは可能だとは思いません。あなたの答えを正しいものとして選択します。 –

1

私はcastとし、オプションのパラメータの解決自身でこの問題のために考え出すことができる唯一の方法。

class Test { 
    static function main() { 
     $type(new Container(1)); 
     $type(new Container(1).example()); 
     new Container(1).example(); 

     $type(new Container(1.0)); 
     $type(new Container(1.0).example()); 
     new Container(1.0).example(); 
    } 
} 

class Container<T:Float> { 
    public var value:T; 

    public function new(aValue:T) { 
     this.value = cast (aValue != null ? aValue : 0); 
    } 

    public function example():T { 
     return cast 16; 
    } 
} 

これは、ログに記録します。
Test.hx:3: characters 14-30 : Warning : Container<Int> Test.hx:4: characters 14-40 : Warning : Int Test.hx:7: characters 14-32 : Warning : Container<Float> Test.hx:8: characters 14-42 : Warning : Float

関連する問題