2017-12-12 8 views
0

공통베이스에서 파생되는 약의 클래스 계층 구조를 정의하고자합니다. 유형은 this one과 같이 AST 계층의 노드를 설명합니다. 나는의 라인을 따라 뭔가를하고 싶습니다 내 copy의 존재가 자동 복사를 정의에서 case classes을 방지하기 때문에많은 사례 클래스가있는 클래스 계층 구조에 대한 공통 복사본을 정의하십시오.

trait Base { 
    def doCopy: Base 
} 

trait CloneSelf[T <: CloneSelf[T]] extends Base { 
    self: T => 

    def copy(): T 
    override def doCopy: T = copy() 
} 


case class CaseA(a: String) extends Base with CloneSelf[CaseA] 

case class CaseB(b: Int) extends Base with CloneSelf[CaseB] 

는이 오류를 제공합니다. 거기에 어떤 방법으로 "클론"doCopy 구현하는그 중 case classes 자동 사용합니까?

답변

1

공통베이스에서 파생 된 약 100 개의 사례 클래스로 클래스 계층을 정의하고 싶습니다.

그렇게하지 마십시오, 당신은 절대적으로 그것을 피할 수있는 패턴을 찾아야한다! 어쨌든이 작업을 수행하려면 ... ducktyping을 시도해보십시오

trait CloneSelf[T <: {def copy(): T}] { 
    self: T => 
    override def doCopy: T = copy() 
} 

지금은 테스트 할 수 없습니다 그래서 이것은 아마 컴파일되지 않습니다,하지만 당신은 일반적인 생각과 스스로 그것을 알아낼 수 있습니다!

편집 :

100 개 서브 클래스를 가진 것은 악 이유 : 인스턴스가 Base에서 BaseCloning로 이름을 변경 당신은, 기본 클래스에서 하나 명의 변경을 수행 상상 - (당신은 모든 자식 클래스에서 변경해야합니다> 100 변경). 당신이, 즉 당신이 당신의 클래스를 사용하여 수행 할 작업에 따라 달라집니다 피하기 creationnal구조 패턴을 확인합니다 어떻게

: 공장, 빌더, 프로토 타입, 플라이급를 항상 얼마나 많은 일 것 "에 대해 생각 ... 합성 기본 수업에서 뭔가 바뀌면 모든 아이들에게 영향을 미칠 수 있습니까? "

+0

자동 복사본을 계속 가져 오는 동안이 문제를 피하기 위해 계층 구조를 디자인하는 일반적인 패턴이 있습니까? (그리고 당신은이 일을하는 데 악이 무엇인지 자세히 설명해 줄 수 있습니까?) – Suma

+0

"당신이베이스 클립에서 한 번의 변화를한다고 상상하십시오." 나는 IDE를 사용하고 있기 때문에 그의 이유를 보지 못하거나 이것에 대한 검색과 바꾸기 때문에 몇개의 클래스가 중요하다. 이것이 사악한 심각한 이유가 있습니까? 기본 클래스의 일반적인 변경으로 인해 파생 클래스에서 변경 사항을 상속하므로 아무 것도 변경하지 않습니다. – Suma

+1

"모든 하위 클래스에서 변경해야합니다." . .또는 당신의 IDE가 당신을 위해 그것을하도록하십시오. – adrice727

0

나는 각 case class에서 doCopyCloneSelf에서 상속 각 클래스를 정의하는 것보다 실제로 적은 작업입니다 정의 발견했다. 코드는 다음과 같습니다

trait Base { 
    def doCopy: Base 
} 

case class CaseA(a: String) extends Base { 
    def doCopy = copy() 
} 

case class CaseB(b: Int) extends Base { 
    def doCopy = copy() 
} 

I 따라서 CaseA("a").doCopy의 정적 유형, 즉 CaseA("a").copy(), CaseA의와 동일 오버라이드 (override) 된 메소드에 명시 적 형식없이 유형이 컴파일러에 의해 추정되는 것을 알고 놀랐습니다, 아니 Base. 각각의 case class에 대한 명시 적 유형을 추가하는 것이 더 분명하지만이 방법은 각 행에 동일한 행을 복사하여 붙여 넣는 것보다 많은 작업이 필요합니다. 별로 중요하지 않습니다. case class 유형을 통해 복사 할 때 copy()을 사용할 수도 있습니다. 내가 Base을 가지고있을 때만 doCopy이 필요합니다. 그러므로 def doCopy: Base = copy()처럼 선언하면 해를 끼치 지 않습니다.

+0

메소드'clone'의 이름을 지정하고'java.lang.Cloneable'을 확장하는'scala.Cloneable'을 확장하는 것이 좋습니다. –

+0

오른쪽. 이 예제가 간단하고 오버 라이딩 된 복제본이 내가 여기에서 피하고 싶은 고유 한 특징을 가지고 있기를 바랬다. 적어도 자바에서는 스칼라가 다른가? – Suma

+0

나는 그것이 다르다라고 말하지 않을 것이다. 나는 단지 당신이 당신 팀의 새로운 개발자 였다면, 어떻게'doCopy'가'clone'과 다른지 궁금 할 것입니다. –

관련 문제