2012-11-23 4 views
1

실례 합니다만 스칼라를 처음 사용합니다. 나는 추상 클래스와 추상 클래스에서 상속하고 해당 필드를 구현하는 구체적인 클래스를 가졌다.생성자 매개 변수에 대한 제약

abstract class Element { 
    var name: String 
    var description: String 
} 

class ConcreteElement (var name: String, var description: String)extends Element 

이게 맞습니까? 예? 추상 클래스 Element에서 상속받은 많은 클래스가 있습니다. 이제 특정 제약 조건에 따라 이름을 인스턴스화하려는 변수 이름을 확인하고 싶습니다. 이 컨트롤은 어디에 두어야합니까? 분명히 추상 클래스 Element.

스칼라 변수 선언 VAR (X)으로

: T로 정의 게터 함수 x 및 세터 함수 X_ = 선언 동등 다음과

def x: T 
def x_= (y: T): Unit 

그래서 I이 방법에서 변수를 선언 결정 getter 메서드 이름에 내 제약 조건이 있습니다.

abstract class Element {  
def name: String 
def name_= (y: String): Unit = {CONSTRAINT} 

var description: String 
} 

클래스 ConcreteElement (VAR 이름 : 문자열, VAR 설명 : 문자열) 요소

이 추론이 정확 확장? ConcreteElement는 실제로 Element? 필드를 구현합니다.

+0

상황에 따라 가변적 인 필드 (바)가 필요한가요? –

+0

일부 필드는 유형이 Set (something) 인 String 유형입니다. var을 사용할 필요가 없다고 생각합니다. 하지만 var를 사용하지 않으면 어떻게 setter에 제약 조건을 설정할 수 있습니까? – user1826663

답변

1

def name_=은 하위 클래스에 의해 재정의되지 않은 경우에만 작동합니다. 따라서 오버라이드되는 것을 방지하려면 final이 필요합니다.

abstract class Element { 
    protected var _name: String 
    final def name: String = _name 
    final def name_= (value: String) { 
    if (isBadValue(value)) throw new IllegalArgumentException 
    _name = value 
    } 
    var description: String 
} 
class ConcreteElement (protected var _name: String, var description: String) extends Element 
+0

답장을 보내 주셔서 감사합니다. 실례지만 어쩌면 나는 분명하지 않을 수도 있습니다. 모델 도메인이 포함 된 패키지가 있습니다. 추상적이고 구체적인 수업으로 구성됩니다. 다른 패키지에서 클래스를 인스턴스화하기 위해 DSL을 구현하려고합니다. 도메인의 일부 필드에 제약 조건이 있습니다. 그들은 모든 가치를 받아 들일 수는 없습니다. 제안한 해결책은 내 문제를 해결하지 못합니다. _name을 상속 했으므로 테스트되지 않습니다. 권리? 다른 패키지에서 작업 할 경우 보호 기능을 사용할 수 있습니까? – user1826663

+0

'ConcreteElement'는'name'과'name_ ='을 오버라이드해서는 안되지만'_name'을 오버라이드 할 수 있습니다. 그리고 다른 클래스는'_name'에 접근해서는 안됩니다. 대신, 그들은'name'과'name_ ='을 사용해야합니다. –

+0

안녕하세요, 죄송하지만 무시할 수있는 방법을 이해할 수 없습니다. Element에서 상속 한 모든 클래스가 "name"필드를 재정의해서는 안되며 요소의 "name"필드를 구현해야합니다. 나쁜 영어 번역에 실례합니다. – user1826663

관련 문제