2016-11-02 16 views
8

私はこのような何かやりたい:Kotlinインターフェースで静的関数を指定することは可能ですか?

interface Serializable<FromType, ToType> { 
    fun serialize(): ToType 
    companion object { 
     abstract fun deserialize(serialized: ToType): FromType 
    } 
} 

かさえ、この私のために働くだろう:

interface Serializable<ToType> { 
    fun serialize(): ToType 
    constructor(serialized: ToType) 
} 

どちらもコンパイルを。 これには構文がありますか、これを工場向けのインターフェイスにすることは強制されますか?また別の回答がありますか?それはすてきですね!

答えて

5

基本的には、companion objectに何もabstract又はopenすることはできない(したがって、オーバーライドされる)、及び方法を有すること、または/インターフェイスでコンストラクタを必要と定義する実装companion objectのを要求する方法はありません。あなたのための

可能な解決策は、二つのインタフェースにこれらの二つの機能を分離することである。

interface Serializable<ToType> { 
    fun serialize(): ToType 
} 

interface Deserializer<FromType, ToType> { 
    fun deserialize(serialized: ToType): FromType 
} 

この方法では、クラス内の最初のインターフェイスを実装し、そのcompanion objectが他のものを実装することができるようになります。

class C: Serializable<String> { 
    override fun serialize(): String = "..." 

    companion object : Deserializer<C, String> { 
     override fun deserialize(serialized: String): C = C() 
    } 
} 

はまた、厳しい制限がonly a single generic specialization of a type can be used as a supertypeことがありますので、インタフェースの実装により、シリアライズのこのモデルはdifferenで複数の実装を許可しない、十分な拡張性がないことが判明しますt ToTypeである。

+3

なぜですか?なぜこのように設計されたのですか? – cuddlecheek

0

私は比較的新しいKotlinです。ここに私の2¢

  1. コンパニオンオブジェクトは、クラスのインスタンスであるとされているように継承することはできません。これが、抽象関数が実装される場所を持たない理由です。 Javaでは、似たような結果には抽象クラスを実装する匿名クラスが必要ですが、クラスのインスタンスのメソッドをオーバーライドすることとは非常に異なります。

  2. インターフェイスをインスタンスの作成に使用できないため、インターフェイスにコンストラクタは使用されません。

ジェネリック抽象クラスを作成しないのはなぜですか?次に、抽象関数またはオープン関数は、serialize():ToTypeおよびdeserialize(serialized:ToType)の両方で機能します。FromType関数。

関連する問題