Heim >Java >javaLernprogramm >So implementieren Sie die Zusammensetzung von Klassen mithilfe von Mixins, einer in Java gängigen Technik

So implementieren Sie die Zusammensetzung von Klassen mithilfe von Mixins, einer in Java gängigen Technik

WBOY
WBOYnach vorne
2023-05-09 22:34:26935Durchsuche

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

🎜🎜Schauen wir uns nun ein interessanteres Beispiel an, bei dem eine abstrakte Klasse verwendet wird: 🎜🎜rrreee🎜🎜In dieser Klasse gibt es einen abstrakten Typ 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen