문제

가능한 복제 :
스칼라 특성 대 추상 수업

추상 클래스와 특성의 개념적 차이는 무엇입니까?

도움이 되었습니까?

해결책

수업 은만 할 수 있습니다 하나의 슈퍼 클래스를 확장합니다, 따라서 하나의 추상 클래스 만. 여러 클래스를 작성하려면 스칼라 방식은 사용하는 것입니다. 혼합 클래스 구성: 당신은 (선택적) 슈퍼 클래스, 자신의 멤버 정의 및 하나 이상의 특성. 생성자 매개 변수를 가질 수 없다는 점에서 클래스와 비교하여 특성이 제한됩니다 (비교 스칼라 참조 매뉴얼).

여러 상속의 전형적인 문제를 피하기 위해 클래스와 비교하여 특성의 제한이 도입됩니다. 상속 계층과 관련하여 다소 복잡한 규칙이 있습니다. 이것이 실제로 중요한 계층 구조를 피하는 것이 가장 좋습니다. ;-) 내가 이해하는 한, 두 개의 다른 특성에서 동일한 이름을 가진 동일한 서명 / 두 개의 변수로 두 가지 방법을 상속하는 경우에만 중요 할 수 있습니다.

다른 팁

특성의 한 가지 측면은 그들이 a라는 것입니다 쌓을 수 있습니다. 제한된 형태의 AOP를 허용합니다 (조언 주변).

trait A{
    def a = 1
}

trait X extends A{
    override def a = {
        println("X")
        super.a
    }
}  


trait Y extends A{
    override def a = {
        println("Y")
        super.a
    }
}

scala> val xy = new AnyRef with X with Y
xy: java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1

scala> val yx = new AnyRef with Y with X
yx: java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1

의 해상도 super 상속 계층의 선형화를 반영합니다.

개념적으로, 특성은 수업 자체가 아니라 클래스의 구성 요소입니다. 따라서 일반적으로 생성자가 없으며 "스스로 견딜 수있는"것은 아닙니다.

독립적 인 의미가있는 경우 추상 클래스와 객체 지향적 인 방식으로 기능을 추가하려는 경우 특성을 사용하는 것이 좋습니다. 둘 사이에 확신이 없다면, 당신은 모든 방법이 하나의 일을하는 것을 중심으로 회전한다면 아마도 특성을 원한다는 것을 알 수 있습니다.

직원이 "사람"과 "클로닝 가능한"을 모두 연장 해야하는 경우 (언어가 아닌) 예를 들어, 사람을 기본 클래스로 만들고 클로닝 가능한 특성을 만들어보십시오.

적어도 스칼라에서는 특성 시스템은 여러 상속과 관련된 전형적인 문제를 피하기 위해 하위 클래스에서 부모 우선 순위를 선언하는 명백한 방법을 가지고 있습니다. 즉, 동일한 서명을 갖는 상속 된 방법과 충돌합니다.

특성은 Java 인터페이스와 유사하지만 메소드 구현이 허용됩니다.

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