추상 클래스와 특성의 차이점
중복 가능성 :
스칼라 특성 대 추상 클래스
추상 클래스와 특성의 개념적 차이점은 무엇입니까?
클래스는 하나의 수퍼 클래스 만 확장 할 수 있으므로 하나의 추상 클래스 만 확장 할 수 있습니다 . 여러 클래스를 구성하려는 경우 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
'Programing' 카테고리의 다른 글
Windows 8.1의 고해상도 화면에서 Eclipse 인터페이스 아이콘이 매우 작음 (0) | 2020.09.05 |
---|---|
숫자의 모든 제수를 구하는 가장 좋은 방법은 무엇입니까? (0) | 2020.09.05 |
테이블에 Lua의 요소가 포함되어 있는지 확인하는 방법은 무엇입니까? (0) | 2020.09.05 |
RPC 프레임 워크와 Apache Thrift 란 무엇입니까? (0) | 2020.09.05 |
html 요소가없는 AngularJS ng-repeat (0) | 2020.09.05 |