문제

빠른 참고 : 자습서의 예 자바 난민을위한 스칼라 5 부 : 특성과 유형.

내가 특성 학생, 근로자, 미달, 젊은이가 있다고 가정 해 봅시다.

수업을 어떻게 선언 할 수 있습니까?인스턴스가 아닙니다), Collegestudent,이 모든 특성과 함께?

메모: 나는 하나 또는 두 가지 특성을 가진 Collegestud와 같은 가장 단순한 사례를 알고 있습니다.

class CollegeStudent extends Student with Worker
도움이 되었습니까?

해결책

클래스를 선언 할 때는 "원하는만큼"키워드를 사용하는 것이 쉽습니다.

class CollegeStudent extends Student with Worker with Underpaid with Young

특성이 수업의 행동을 바꾸는 경우 특성의 순서가 중요 할 수 있습니다. 모두 사용하는 특성에 달려 있습니다.

또한 항상 동일한 특성을 사용하는 수업을 원하지 않으면 나중에 사용할 수 있습니다.

class CollegeStudent extends Student
new CollegeStudent with Worker with Underpaid with NotSoYoungAnymore

다른 팁

구문뿐만 아니라 또한 특성의 순서가 어떤 역할을하는지. Jason Swartz의 설명을 찾았습니다 학습 스칼라 (페이지 177) 꽤 깨달음.

  • 스칼라 클래스는 한 번에 여러 특성을 확장 할 수 있지만 JVM 클래스는 하나의 부모 클래스 만 확장 할 수 있습니다. 스칼라 컴파일러는 만들어이를 해결합니다.클래스와 특성의 키가 크고 단일 열 계층을 형성하기 위해 각 특성의 사본", 알려진 프로세스 선형화.

  • 이러한 맥락에서, 동일한 필드 이름을 가진 여러 특성을 확장하는 것은 정확히 동일하게 컴파일하지 못할 것입니다. "클래스를 연장하고 자신만의 메소드 버전을 제공하지만 재정의 키워드를 추가하지 못한 것처럼".

그리고 상속 트리의 모양을 결정하기 때문에 선형화 순서는 실제로 매우 중요한 질문 중 하나입니다. 예로서, class D extends A with B with C (여기서 A는 클래스이고 B와 C는 특성입니다) class D extends C extends B extends A. 이 책의 다음 몇 줄도 다음과 같이 완벽하게 설명합니다.

trait Base { override def toString = "Base" }
class A extends Base { override def toString = "A->" + super.toString }
trait B extends Base { override def toString = "B->" + super.toString }
trait C extends Base { override def toString = "C->" + super.toString }
class D extends A with B with C { override def toString = "D->" + super.toString }

전화 new D() REPL은 다음을 인쇄 할 것입니다.

 D->C->B->A->Base

이는 선형화 된 상속 그래프의 구조를 완벽하게 반영합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top