您好!欢迎来到北极熊

北极熊

热门搜索: 任正非传    神雕侠侣    红楼梦   

java怎么通过混入来组合类

分类:软件开发应用 时间:2022-11-29 20:17 浏览:139
概述
当某个特质被用于组合类时,被称为混入。abstract class A { val message: String}class B extends A { val message = "I'm an instance of class B"}trait C extends
内容

当某个特质被用于组合类时,被称为混入。

abstract class A { val message: String}class B extends A { val message = "I'm an instance of class B"}trait C extends A { def loudMessage = message.toUpperCase()}class D extends B with C
val d = new Dprintln(d.message) // I'm an instance of class Bprintln(d.loudMessage) // I'M AN INSTANCE OF CLASS B

类   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  。如果是单一继承,我们将不会达到这样的灵活性。


评论
资讯正文页右侧广告
联系我们
电话:18936411277
邮箱:1044412291@qq.com
时间:09:00 - 19:00
公众号:北格软件
底部广告