Wenn ein Merkmal in einer kombinierten Klasse verwendet wird, wird es als Mixin bezeichnet.
<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>
Kategorie
D
Es gibt eine übergeordnete Klasse
B
und eine Mischung
C
. Eine Klasse kann nur eine übergeordnete Klasse haben, aber mehrere Mixins (mit dem Schlüsselwort
erweitern
Und
mit
). Mixins können dieselbe übergeordnete Klasse wie eine übergeordnete Klasse haben.
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
T
und Standard-Iteratormethoden. 🎜🎜Als nächstes implementieren wir eine konkrete Klasse (alle abstrakten Mitglieder).
T
,
hasNext
Und
nächster
wird implementiert): 🎜🎜rrreee🎜🎜StringIterator
mit einem
String
Konstruktor für Typparameter, die zum Durchlaufen von Zeichenfolgen verwendet werden können. (z. B. um zu sehen, ob eine Zeichenfolge ein bestimmtes Zeichen enthält): 🎜🎜Jetzt erstellen wir ein Merkmal, von dem auch erbt
AbsIterator
. 🎜🎜rrreee🎜🎜Diese Eigenschaft ist implementiert
foreach
Methode – solange noch Elemente zum Durchlaufen vorhanden sind (
while (hasNext)
), wird immer auf das nächste Element geschaut (
next()
) ruft die übergebene Funktion auf
f: T => Einheit
. Weil
RichIterator
Es ist eine Eigenschaft und muss nicht implementiert werden
AbsIterator
Abstrakte Mitglieder in . 🎜🎜Jetzt machen wir es
StringIterator
Und
RichIterator
Die Funktionen in werden zu einer Klasse zusammengefasst. 🎜🎜rrreee🎜🎜Neue Klasse
RichStringIter
Es gibt eine übergeordnete Klasse
StringIterator
und eine Mischung
RichIterator
. Bei einer Einzelvererbung hätten wir diese Flexibilität nicht. 🎜Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Zusammensetzung von Klassen mithilfe von Mixins, einer in Java gängigen Technik. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!