Maison >Java >javaDidacticiel >Comment implémenter la composition de classes à l'aide de mixins, une technique courante en Java
Lorsqu'un trait est utilisé dans une classe combinée, on l'appelle un 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>
catégorie
D
Il y a une classe parent
B
et un mélange
C
. Une classe ne peut avoir qu'une seule classe parent mais peut avoir plusieurs mixins (en utilisant le mot-clé
étendre
et
avec
). Les mixins peuvent avoir la même classe parent qu'une classe parent.
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
et les méthodes d'itérateur standard. #🎜🎜##🎜🎜#Ensuite, nous implémenterons une classe concrète (tous les membres abstraits
T
,
hasNext
et
suivant
sera implémenté) : #🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜#StringIterator
avec un
Chaîne
Constructeur de paramètres de type pouvant être utilisés pour parcourir des chaînes. (Par exemple, vérifiez si une chaîne contient un certain caractère) : #🎜🎜##🎜🎜#Maintenant, nous créons un trait qui hérite également de
AbsItérateur
. #🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜#Ce trait est réalisé
foreach
Méthode - tant qu'il y a encore des éléments sur lesquels parcourir (
pendant que (hasNext)
), il regardera toujours l'élément suivant (
suivant()
) appelle la fonction passée
f : T => Unité
. parce que
RichItérateur
C'est un trait et n'a pas besoin d'être mis en œuvre
AbsItérateur
Membres abstraits dans . #🎜🎜##🎜🎜# Ensuite, nous allons
StringIterator
et
RichItérateur
Les fonctions sont combinées dans une classe. #🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜#nouvelle catégorie
RichStringIter
Il y a une classe parent
StringIterator
et un mélange
RichItérateur
. Avec un héritage unique, nous n’aurions pas cette flexibilité. #🎜🎜#Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!