Maison >Java >javaDidacticiel >Comment implémenter la composition de classes à l'aide de mixins, une technique courante en Java

Comment implémenter la composition de classes à l'aide de mixins, une technique courante en Java

WBOY
WBOYavant
2023-05-09 22:34:26967parcourir

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

#🎜🎜##🎜🎜#Maintenant, regardons un exemple plus intéressant où des classes abstraites sont utilisées : #🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜# Il y a un type abstrait dans cette classe 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer