나는 그것에 대해 정의 된 몇 가지 스태킹 특성을 가진 추상 기본 클래스 (Base
)가 있습니다 (StackingTrait
).스칼라 : 추상 기본 클래스가있는 Trait Mixin
trait Base {
def foo
}
trait StackingTrait extends Base {
abstract override def foo { super.foo }
}
다음과 같은 구문을 사용하여 서브 클래스를 구현하기가 매우 편리 할 것이다, 그러나 컴파일러는 foo는 다음 override
와 함께 선언 할 필요가 있다고하기 때문에이 작동하지 않기 때문에 유효 재 컴파일에 abstract override
와 Impl
은 수업입니다.
class Impl extends Base with StackingTrait {
def foo {}
}
그런 구문이 허용되지 않는 이유에 대해서는 생각할 수 없습니다. foo는 논리적으로 Impl
으로 정의되므로 개념적으로 스태킹 순서가 동일하게 유지됩니다.
참고 : 내가 원하는 것과 동일한 효과를 발휘할 수있는이 해결 방법을 알았지 만 도우미 클래스의 필요성으로 인해 더 나은 해결책을 원합니다.
class ImplHelper extends Base {
def foo {}
}
class Impl extends ImplHelper with StackingTrait
왜 원하는 구문이 컴파일되지 않고 우아한 해결책이 있습니까?
위대한 답변! 나는 바로이 시나리오에 관한 질문을 올리려고했다. 감사! –
방금이 문제가 발생했습니다. 선형화는 궁극적으로 이것에 대해 옳았지 만, 형질을 쌓는 실제 목적은 다음과 같습니다. 스태킹 특성을 사용하여 일반적인 추상 클래스/특성의 기존 구체 구현에만 수정할 수 있습니다. 예. 'abstract class List'와'Mod Mod extends List'를 가지고 있습니다. 'class Foo extends Mod with List'라고 쓸 수는 없습니다. 먼저'LinkedList extends List' 클래스와 같이 구체적인 List를 가져야합니다. 그런 다음'Class Bar extends Moded with LinkedList '를 작성할 수 있습니다. 희망은 그 말이 맞습니다. –
나는 이것이 추상적 인 오버라이드 (abstract override) 메쏘드를 가진 형질에만 관심이 있다는 것을 잊어 버렸다. 그러한 방법이 없으면 형질이 자유롭게 혼합 될 수 있습니다. –