다음과 같은 특성 계층 구조가 있습니다. TraitA
은 루트 특성이며 내 데이터 구조가 변경되지 않도록하려면 commonUpdateFunction()
함수에 일반 반환 형식이 있어야합니다. 이것이 최선의 방법인지 확실하지 않습니다. 나는 다른 두 가지 기능을 추가하여 그것을 확장하는 두 가지 특성을 가지고있다. 일부 클래스는 하나를 확장하고 일부 클래스는 다른 클래스를 확장하지만 일부 클래스는 두 클래스를 모두 확장해야합니다.여러 수준의 특성을 확장 할 때 불변의 반환 형식 상속
그러나 지금은 데이터 구조를 새로운 것으로 업데이트 할 때 실제로 올바른 유형을 얻으려는 경우 불법 상속을받는 일반적인 유형의 문제로 인해 문제가 발생합니다.
또한이 일반적인 유형 때문에 TraitA
을 매개 변수로 전달할 수없는 것 같습니다.
trait TraitA[T <: TraitA[T]]
{
self : T =>
def commonUpdateFunction() : T
}
trait TraitB extends TraitA[TraitB]
{
def someFunctionB() : Integer = { /// some code }
}
trait TraitC extends TraitA[TraitC]
{
def someFunctionC() : Unit = { /// some code }
}
class ClassB extends TraitB
{
def commonUpdateFunction() : ClassB = { /// some code }
}
class ClassC extends TraitC
{
def commonUpdateFunction() : ClassC = { /// some code }
}
class ClassA extends TraitB with TraitC //**this causes illegal inheritance**
{
def commonUpdateFunction() : ClassA = { /// some code }
}
동시에 적합한 유형의 데이터 구조의 불변 갱신하면서 2 특징에 상속을 달성하기위한 적당한 방법은 무엇인가? JVM을 비록
class ClassA extends TraitB with TraitC {
def commonFunction() : ClassA = { /// some code }
def commonFunction() : ClassB = { /// some code }
def commonFunction() : ClassC = { /// some code }
}
가 과부하 허용 않습니다
나는 스칼라 초심자이기 때문에 몇 가지 중요한 디자인 원칙을 놓칠 수 있습니다. 내가 알아 내려고 애 쓰고있는 것은 전통적인 OO 다형성을 달성하는 동시에 데이터 객체를 불변으로 유지하는 것입니다. 이것은 전형적인 예입니다 :'Employee'는'name'과'employeeId'를 가진 추상 클래스로서,'Technician'과'Manager'처럼 클래스가 몇 개 확장됩니다. 'name'이나'employeeId'를 갱신하는 메소드는 불변이 될 경우 동일한 유형의 또 다른 인스턴스를 생성해야합니다. 반면 시스템의 나머지 부분에는'Employee'를 취하는 메서드가 있습니다. – jbx
이 시나리오에서는'Employee'를 특성으로 만들고 Technician 및 Manager에 대한 case 클래스 하위 유형을 지정할 수 있습니다. 'commonUpdateFunction'에 대해했던 것처럼'withName'과'withId'를 선언하고'copy' 메소드의 관점에서 case 클래스를 정의하십시오. 당신이'commonFunction'과'commonUpdateFunction'을 당신의 예제에서 같은 의미로 쓰는 지 궁금합니다. 왜냐하면 지금 당장은 매우 다르니까 –
예, 저의 실수였습니다. 결정된. 그렇습니다. 문제는 완전히 관련이없는 클래스의 메서드에 대한 인수로 'Employee'를 사용해야하는 다른 곳에서 발생합니다. 그것이 어떤 유형의 직원인지 상관하지 않습니다. 현재로서는 불변 클래스의 실제 타입을 결정하기위한 해킹 인'[T] '가 있기 때문에 타입을 지정해야한다는 오류가 발생합니다. – jbx