Apabila sesuatu sifat digunakan dalam kelas komposit, ia dipanggil mixin.
<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>
kelas
D
Ada kelas ibu bapa
B
dan campuran masuk
C
. Kelas hanya boleh mempunyai satu kelas induk tetapi boleh mempunyai berbilang campuran (menggunakan kata kunci
extend
dan
with
). Mixin mungkin mempunyai kelas induk yang sama dengan kelas induk.
Sekarang, mari lihat contoh yang lebih menarik di mana kelas abstrak digunakan:
abstract class AbsIterator { type T def hasNext: Boolean def next(): T}
Terdapat jenis abstrak dalam kelas ini
T
dan kaedah lelaran piawai.
Seterusnya, kami akan melaksanakan kelas konkrit (semua ahli abstrak
T
,
hasNext
dan
next
akan direalisasikan):
abstract class AbsIterator { type T def hasNext: Boolean def next(): T }
StringIterator
dengan a
String
Pembina untuk parameter jenis yang boleh digunakan untuk mengulangi rentetan. (cth. untuk melihat sama ada rentetan mengandungi aksara tertentu):
Sekarang kita mencipta sifat yang turut diwarisi daripada
AbsIterator
.
trait RichIterator extends AbsIterator { def foreach(f: T => Unit): Unit = while (hasNext) f(next()) }
Sifat ini dilaksanakan
foreach
Kaedah - selagi masih ada elemen untuk diulang (
while (hasNext)
), ia akan sentiasa melihat elemen seterusnya (
next()
) memanggil fungsi yang diluluskan
f: T => Unit
. sebab
RichIterator
Ia adalah sifat dan tidak perlu dilaksanakan
AbsIterator
Ahli abstrak dalam .
Sekarang kita akan
StringIterator
dan
RichIterator
Fungsi dalam digabungkan ke dalam kelas.
object StringIteratorTest extends App { class RichStringIter extends StringIterator("Scala") with RichIterator val richStringIter = new RichStringIter richStringIter foreach println }
Kelas baharu
RichStringIter
Ada kelas ibu bapa
StringIterator
dan campuran masuk
RichIterator
. Dengan warisan tunggal, kami tidak akan mempunyai fleksibiliti ini.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan komposisi kelas menggunakan mixin, teknik biasa di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!