2016-06-02 6 views
3

이 문제는 Kotlin class delegation이 생성자 매개 변수로만 위임 할 수 있으므로 사실상 생성자에게 인수를 제공해야합니다.Kotlin에서 인터페이스에 위임하고 인수가없는 public 생성자 만 제공하는 방법은 무엇입니까?

다음은이 문제의 구체적인 사용 사례와 관련된 원래의 질문입니다.


나는 다음을 수행 할 :

val myTable1: MyTable = MyTable() 

  • MyTableImmutableTable (src)에서 상속 또는 적어도 Table
  • 내가 수동으로 위임 할 필요가 없습니다 모든 기본 구현에 대한 모든 Table 메소드.

은 또한 다음과 같은 피하고 싶은 :

val myTable2: MyTable = MyTable.build() 

즉 내가 동반자를 사용하도록 강제하지 않으려는/static 팩토리 메소드를 객체.

나는 ImmutableTable을 연장하려고 시도했지만, 나는 This type has a constructor, and thus must be initialized here이되었습니다.

Table 인터페이스를 확장하여 (재 구현 방법을 피하기 위해) 위임하려고했지만 그 다음에 생성자 매개 변수 Table의 인스턴스를 제공해야합니다. 그냥 init {} 블록에서 초기화 할 수 없습니다.

정확한 시도는 this gist을 참조하십시오. 사용

코 틀린 버전 : 1.0.2 의견에서 언급 한 바와 같이

+1

해결하려는 문제를 설명해 주시겠습니까? 필자는'ImmutableTable'에서 파생되는 것이 쉬운 일은 아니지만 이것이 최종 목표는 아니라고 생각합니다. – miensol

+0

제 최종 목표는 Table 인터페이스를 상속 (확장/구현)하는 클래스의 인수가없는 생성자를 호출 할 수있게하는 것입니다. 동시에 모든 테이블 메서드를 다시 구현해야하는 것은 아닙니다. 테이블의 많은 메소드를 구현할 때 ImmutableTable을 상속 할 수 있기를 바랬지 만, 당신이 ImmutableTable을 설계 상으로는 상속받을 수 없다는 것이 맞을 수도 있습니다. 이 경우 필자는 Table과 직접 작업해야합니다. 그러나 테이블에 위임하려면 메서드를 다시 구현하지 않으려면 Table을 arg로 사용하는 생성자를 사용해야합니다. –

+1

나는 Kotlin을 모른다. 그러나 : ['ForwardingTable'] (http://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/ForwardingTable.html) 도움이 되나요? 이리? 'ImmutableTable'과 달리, 확장 가능합니다. 'ImmutableTable' 델리게이트로 전달할 수 있습니다. –

답변

5

, 구아바이 작업을 수행 할 수 ForwardingTable 있습니다. 그러나 "전달"버전이 정의되지 않은 인터페이스에서도 작동해야하는 또 다른 옵션이 있습니다.

class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table { 

    constructor() : this(TreeBasedTable.create()) // or a different type of table if desired 

} 
+1

기본 기본 생성자와 기본 보조 기본 생성자 대신 공용 보조 생성자를 사용하는 이유는 무엇입니까? 즉 단순히 class MyTable (Table : Table = TreeBasedTable.create())을 사용하지 않는 이유는 무엇입니까? Table by table'? – mfulton26

+2

잘 작동해야합니다. 필자는 코드 호출이'Table' 구현을 전혀 제공 할 수 없다는 가정하에 진행했습니다. –

+0

그건 제가 간과 한 것입니다. 고마워요. – mfulton26