2016-06-29 21 views
1

私はcalculationBのコンストラクター、のようなものに提供されるように、クラスB(例えば)でAを実装したいインターフェースパラメータ化機能とインターフェイスを実装

interface A { 
    fun calculate(n: Int): Int 
} 

があるとします。

class B (f : (Int) -> Int) : A { 
    override fun calculate(n: Int): Int //...somehow assign f to calculate 
} 

が、これはfBのプロパティをすることなく行うことができますか?

うーん...この作品:

interface A { 
    val calculate: (n: Int) -> Int 
} 

class B(f: (Int) -> Int) : A { 
    override val calculate = f 
} 

を誰かがfunとここvalとの意図構文上の違いを説明することはできますか?私はFunction definition: fun vs valを知っていますが、「言語レベル」の理解を得たいと考えています。

+0

なぜそれがBの性質fを作るために問題ありますか?それがあなたの心配なら、それを非公開にすることができます。 –

+0

はい、私は '(プライベートval f:(Int) - > Int)'を実行し、 'calculate(n:Int):Int = f(n)'を持つことができます。 –

+0

さて、関数の参照をどこかに格納する必要があります。 –

答えて

1

はい、fのプロパティをBにすることなく行うことができます。例えばobject expressionからclass delegation使用することにより:それでも

class B(f: (Int) -> Int) : A by object : A { 
    override fun calculate(n: Int) = f(n) 
} 

を、private valは、この単純な例のためのより適切と思われます。

+0

これは実際には二重の委任ですね。匿名クラスインスタンスはfに委譲し、クラスBは匿名クラスインスタンスに委譲します。 –

+0

@JBNizetはい:インターフェイスの実装は委任され、関数の実装はその意味で委任されています。それを指摘してくれてありがとう! – mfulton26

3

これを実装する最も簡単な方法は次のとおりです。

class B(val f : (Int) -> Int) : A { 
    override fun calculate(n: Int): Int = f(n) 
} 
関連する問題