2014-10-18 4 views
41

데이터 클래스가 Java의 구식 POJO를 대체하는 것으로 보입니다. 이러한 클래스가 상속을 허용 할 것으로 예상되지만 데이터 클래스를 확장하는 편리한 방법이 없다는 것을 알 수 있습니다.Kotlin에서 데이터 클래스 확장하기

open data class Resource (var id: Long = 0, var location: String = "") 
data class Book (var isbn: String) : Resource() 

위의 코드는 때문에 component1() 방법 중 충돌의 실패 : 내가 필요한 것은이 같은 것입니다. 오직 하나의 클래스에만 data 주석을 남겨도 작업을 수행하지 않습니다.

아마도 데이터 클래스를 확장하는 다른 숙어가 있을까요?

UPD : 자식 하위 클래스에만 주석을 달았지만 data 주석은 생성자에 선언 된 속성 만 처리합니다. 즉, 나는 추한 인을 모든 부모의 속성 open을 선언하고 무시해야합니다 :

open class Resource (open var id: Long = 0, open var location: String = "") 
data class Book (
    override var id: Long = 0, 
    override var location: String = "", 
    var isbn: String 
) : Resource() 
+0

무엇이 component1입니까? – maaartinus

+0

Kotlin은 암시 적으로 N 번째 속성의 값을 반환하는 'componentN()'메서드를 만듭니다. docs [Multi-Declarations] (http://kotlinlang.org/docs/reference/multi-declarations.html) – Dmitry

+0

속성을 열려면 Resource abstract를 만들거나 컴파일러 플러그인을 사용할 수도 있습니다. Kotlin은 개폐 원칙에 엄격합니다. –

답변

33

진실은 : 데이터 클래스 상속과 너무 잘 재생되지 않습니다. 우리는 데이터 클래스의 상속을 금지하거나 심각하게 제한하는 것을 고려하고 있습니다. 예를 들어, 추상화되지 않은 클래스의 계층 구조에 equals()을 올바르게 구현할 방법이 없다는 것이 알려져 있습니다.

그래서 모든 것을 제공 할 수 있습니다. 상속을 데이터 클래스와 함께 사용하지 마십시오.

+0

Hey Andrey, 데이터 클래스에서 생성되는 equals()는 어떻게 작동합니까? 유형이 정확하고 모든 공통 필드가 동일하거나 필드가 동일한 경우에만 일치합니까? 대수 데이터 형식을 근사하기위한 클래스 상속의 가치 때문에이 문제에 대한 해결책을 생각해 볼 가치가 있습니다. 흥미롭게도, 간단한 검색으로 마틴 오데 스키 (Martin Odersky)의 주제에 대한 토론이있었습니다. http://www.artima.com/lejava/articles/equality.html – orospakr

+1

나는이 문제에 대한 해결책이 많지 않다고 생각합니다. 지금까지 데이터 클래스에는 데이터 하위 클래스가 없어야한다는 의견이있었습니다. –

+1

우리는 ORM과 같은 라이브러리 코드가 있다면 우리의 모델을 영구 데이터 모델로 확장하고 싶습니까? –

18

생성자 외부의 수퍼 클래스에서 속성을 추상으로 선언하고 하위 클래스에서이를 재정의합니다.

abstract class Resource { 
    abstract var id: Long 
    abstract var location: String 
} 

data class Book (
    override var id: Long = 0, 
    override var location: String = "", 
    var isbn: String 
) : Resource() 
+1

이것이 가장 유연한 것 같습니다. 비록 우리가 서로간에 상속받는 데이터 클래스를 가질 수 있었으면 좋겠다. – Adam

+0

이것이 가장 좋은 방법이다. –