scala习题(十)——特质

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26786555/article/details/50383219

重点章节,与java有着比较大的分歧,在java与scala中都仅能继承一个基类,这么做是为了避免菱形继承,所以两者都限制的很死,只能单继承,但这样就对类的特质化产生了障碍,而为了避免这些问题,java提供了interface,scala则提供了trait也就是特质,接口类和trait的区别在于,一个仅能提供抽象的方法,且不能包含具体实现方法和字段,而在trait中则没有这个限制,trait与scala中类的区别只有一点,就是没有带参数的构造函数

一、java.awt.Rectangle类有两个很好用的方法translate和grow,但可惜的是像java.awt.geom.Eclipse2D这样的类中没有。在scala中,你可以解决掉这个问题。定义一个RectangleLike特质,加入具体的translate和grow方法,提供任何你需要用来实现的方法,即便你可以像如下的代码这样混入特质

val egg=new java.awt.geom.Eclipse2D.Double(5,10,20,30) with RectangleLike
egg.translate(10,-10)
egg.groww(10,20)
  trait RectangleLike {
  //自身类型代表只能混入eclipse2d类
    this:java.awt.geom.Ellipse2D.Double=>
    def translate(x:Int,y:Int):Unit={
      this.x=x;
      this.y=y;
    }
    def grow(x:Int,y:Int){
      this.x=x;
      this.y=y;
    }
  }

2.通过把scala.math.Ordered[Point]混入java.awt.Point的方式,定义OrdererPoint类,按辞典编辑方式排序,也就是说,如果x

import java.awt.Point;
class OrderPoint extends Point with scala.math.Ordered[Point]{
def compare(that :Point):Int={
if(this.x

3.查看bitset类,将它的所有超类和特质绘制成一张图,忽略类型参数([….)中的所有内容,然后给出改特质的线性化规格内容

trait BitSet extends SortedSet[Int] with BitSetLike[BitSet]
继承自SortedSet类和BitSetLike特质,具体内容可以去scaladoc中看

4.提供一个CryptoLogger类,将日志信息以凯撒密码加密,缺省情况下密钥为3,不过使用者也可以重写它,提供缺省密钥为3和-3作为密钥时的使用示例
凯撒密码就是原有字符基础上+上偏移量来达成,容错方面,下面不做深入

  trait logger{
    def printlog(content:String,key:Int = 3):String   
  }
  class CryptoLogger extends logger{
     def printlog(content:String,key:Int = 3):String={
       val s=for(i<- content) yield {
          (i+key).toChar;

       }
       s;
     }
  }

5.
这里写图片描述

在scala中虽然特质的混入没有任何限制,但需要注意,如果特质继承自类,则只能混入继承该类的类里面,否则会像下面的列子里一样报错

scala> class Foo
defined class Foo

scala> trait FooTrait extends Foo
defined trait FooTrait

scala> val good = new Foo with FooTrait
good: Foo with FooTrait = $anon$1@773d3f62

scala> class Bar
defined class Bar

scala> val bad = new Bar with FooTrait
<console>:10: error: illegal inheritance; superclass Bar
 is not a subclass of the superclass Foo
 of the mixin trait FooTrait
       val bad = new Bar with FooTrait

//题解只能是这样
//自己实现propertyChangeSupport的特质,然后混入java.Point,直接继承必然会报错
trait propertyChange //自己实现
val p=new Point() with propertyChange;//混入特质

6.因为java中只可以单继承,所以jcontainer不能够直接继承Container和jcomponent,scala中可以通过特质来实现

7.写一个展现特质的类

  class animal{
    val animalname:String="animal";

  }
  trait  predation{
     val animalname:String;
    def predation(s:String){
       println(animalname+" is prey on "+s);
    }
  }
  trait feed{
     val animalname:String;
    def feed(){
      println(animalname+" is feed by people");
    }
  }
  class cat extends {override val animalname="cat"} with animal with feed with predation{


  }

8.在javaio类库中,你可以通过BufferInputStream修饰器来给输入流增加缓冲机制,用特质来重写缓冲,简单起见,重写read方法

查看java.io的源代码,如果没有可以使用jui来反编译一下,之后将源代码复制过来注意好特质的特点,不能有含有参数的构造器即可,之后补上

9.使用本章的日志生成器特质,给前一个练习中的方案增加日志功能,要求体现出缓冲的效果

查看java.io的源代码,如果没有可以使用jui来反编译一下,之后将源代码复制过来注意好特质的特点,不能有含有参数的构造器即可,之后补上

10.实现一个iterableInputStream类,扩展java.io.inputStream并混入iterable[byte]特质

  class IterableInputStream extends InputStream with Iterable[Byte]{
    override def read():Int={
      return 1;
    }
    override def iterator: Iterator[Byte]=null;
  }
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页