문제

나는 Scala에 관한 책을 읽고 있었고 언급이 있습니다. 쌓을 수있는 수정 사용 특성. 무엇인가 쌓을 수있는 수정 그리고 어떤 목적으로 그것들을 사용해야합니까?

도움이 되었습니까?

해결책

쌓을 수있는 수정을 구별하는 기본 품질 (용어가 스칼라에서 사용되므로)은 "슈퍼"는 특성이 어떻게 혼합되는지에 따라 동적으로 영향을받는 반면, 일반적으로 슈퍼는 정적으로 결정된 대상이라는 것입니다.

당신이 쓰면

abstract class Bar { def bar(x: Int): Int }
class Foo extends Bar { def bar(x: Int) = x }

Foo "Super"는 항상 막대가됩니다.

당신이 쓰면

trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) }

그런 다음 그 방법의 경우 수업이 만들어 질 때까지 Super는 알려지지 않았습니다.

trait Foo2 extends Foo { abstract override def bar(x: Int) = x * super.bar(x) }

scala> (new Foo with Foo2 with Foo1).bar(5)
res0: Int = 30

scala> (new Foo with Foo1 with Foo2).bar(5)
res1: Int = 50

이것이 흥미로운 이유는 무엇입니까? 예시적인 예는 압축, 암호화 및 디지털로 표시하려는 일부 데이터 일 수 있습니다. 압축 한 다음 서명 한 다음 서명하거나 서명 한 다음 압축 등을 암호화하고 원할 수도 있습니다. 이러한 방식으로 구성 요소를 디자인하면 원하는 방식으로 정리 된 비트로 사용자 정의 된 객체를 인스턴스화 할 수 있습니다.

다른 팁

나는 보았다 실제 스칼라 프레젠테이션 용어 쌓을 수있는 수정 또한 사용됩니다. 분명히 그것은 재정의 할 때 슈퍼 방법을 호출하고 본질적으로 기능을 추가하고 대체하지 않는 특성입니다. 따라서 특성으로 기능을 축적하고 Java에서 종종 측면을 사용하는 곳에서 사용할 수 있습니다. 특성은 "흥미로운"방법을 무시하고 로깅 등과 같은 특정 기능을 추가 한 다음 Super를 호출하고 "공을 전달"하는 것과 체인의 다음 특성으로 측면의 역할을합니다. HTH.

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