當某個特質被用來組合類別時,稱為混入。
<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中文網其他相關文章!