결합된 클래스에서 특성이 사용되는 경우 이를 믹스인이라고 합니다.
<p><code>abstract class A {</code><code> val message: String</code><code>}</code><code>class B extends A {</code><code> val message = "I'm an instance of class B"</code><code>}</code><code>trait C extends A {</code><code> def loudMessage = message.toUpperCase()</code><code>}</code><code>class D extends B with C</code><code><br></code><code>val d = new D</code><code>println(d.message) // I'm an instance of class B</code><code>println(d.loudMessage) // I'M AN INSTANCE OF CLASS B</code></p>
카테고리
D
부모 클래스가 있습니다
B
그리고 믹스인
C
. 클래스는 하나의 상위 클래스만 가질 수 있지만 여러 믹스인을 가질 수 있습니다(키워드 사용).
extend
그리고
with
). 믹스인은 상위 클래스와 동일한 상위 클래스를 가질 수 있습니다.
이제 추상 클래스가 사용되는 좀 더 흥미로운 예를 살펴보겠습니다.
abstract class AbsIterator { type T def hasNext: Boolean def next(): T}
이 클래스에는 추상 유형이 있습니다.
T
표준 반복자 방법.
다음으로 구체적인 클래스(모든 추상 멤버)를 구현하겠습니다.
T
,
hasNext
그리고
next
실현될 것입니다):
abstract class AbsIterator { type T def hasNext: Boolean def next(): T }
StringIterator
와
String
문자열을 반복하는 데 사용할 수 있는 유형 매개변수의 생성자입니다. (예: 문자열에 특정 문자가 포함되어 있는지 확인하기 위해):
이제 다음을 상속하는 특성을 만듭니다.
AbsIterator
.
trait RichIterator extends AbsIterator { def foreach(f: T => Unit): Unit = while (hasNext) f(next()) }
이 특성이 구현되었습니다.
foreach
방법 - 반복할 요소가 아직 있는 한(
while (hasNext)
), 항상 다음 요소(
next()
) 전달된 함수를 호출합니다.
f: T => Unit
. 왜냐하면
RichIterator
이는 특성이므로 구현할 필요가 없습니다.
AbsIterator
의 추상 멤버입니다.
이제 우리는
StringIterator
그리고
RichIterator
의 함수는 클래스로 결합됩니다.
object StringIteratorTest extends App { class RichStringIter extends StringIterator("Scala") with RichIterator val richStringIter = new RichStringIter richStringIter foreach println }
새 수업
RichStringIter
부모 클래스가 있습니다
StringIterator
그리고 믹스인
RichIterator
. 단일 상속을 사용하면 이러한 유연성이 없습니다.
위 내용은 Java의 일반적인 기술인 믹스인을 사용하여 클래스 구성을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!