Programing

추상 클래스와 특성의 차이점

lottogame 2020. 9. 5. 10:30
반응형

추상 클래스와 특성의 차이점


중복 가능성 :
스칼라 특성 대 추상 클래스

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


클래스는 하나의 수퍼 클래스확장 할 수 있으므로 하나의 추상 클래스 확장 할 수 있습니다 . 여러 클래스를 구성하려는 경우 Scala 방식은 mixin 클래스 구성 을 사용 하는 것입니다. (선택 사항) 수퍼 클래스, 자신의 멤버 정의 및 하나 이상의 특성을 결합 합니다. 특성은 생성자 매개 변수를 가질 수 없다는 점에서 클래스와 비교하여 제한됩니다 ( scala 참조 매뉴얼 비교 ).

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


특성의 한 측면은 쌓을 수 있다는 것 입니다. 제약 된 형태의 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는 상속 계층 구조의 선형화 반영합니다.


개념적으로 트레이 트는 클래스 자체가 아니라 클래스의 구성 요소입니다. 따라서 일반적으로 생성자가 없으며 "스탠드"를 의미하지 않습니다.

I suggest using an abstract class when it has an independent meaning, and traits when you just want to add functionality in an object-oriented manner. If you're not sure between the two, you might find that if all your methods revolve around doing a single thing, you probably want a trait.

For a (non-language-specific) example, if your Employee should extend both "Person" and "Cloneable", make Person a base class and Cloneable a trait.


At least in Scala, the traits system has an explicit way of declaring parent priority in a subclass to avoid typical problems associated with multiple inheritance, i.e. conflicts with inherited methods having the same signature.

Traits are akin to Java interfaces, but are allowed to have method implementations.

참고URL : https://stackoverflow.com/questions/2005681/difference-between-abstract-class-and-trait

반응형