关闭

scala学习-介绍scala的几种特性6

标签: scala
565人阅读 评论(0) 收藏 举报
分类:

案例来自于引路蜂
本文介绍完整的定义一个类。定义函数化对象,函数化对象的意思是所定义的类和对象都不包含任何可以修改的状态。还会介绍Scala的几种特性:类参数和构造函数,方法,操作符,私有成员,重载,过载,条件查询,引用自身。
1类定义规范
定义一个有理数的类。有理数的定义:一个有理数可以表示成分数的形式:n/d,其中n和d都是整数,d不能为0。
因此我们定义的个有理数类,Rational类,能支持上面的描述和有理数的操作。有理数的=-*/<,并且可以支持有理数的规范表达,比如2/10,其规范表达是1/5,分子和分母的最小公倍数为1。
我们开始来定义这个类,定义成函数化对象,就说明里面是没有可变的状态的,即是使用immutable方式来定义。我们需要定义分子和分母。

package org.wq.learn
class Rational (n:Int,d:Int)

这和java中定义的类不一样,定义类的时候可以带参数,这个叫做类参数。类参数就是和构造函数一样的功能哈。这样就简化了代码。
Scala编译器会编译任何不属于类成员和类方法的其他代码,因为这些代码将作为类构造函数,比如在下面打印一条语句。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
}
object Rational extends App{
  new Rational(1,2)
}
结果为:i am a class construction~1/2

可以看见在创建对象的时候,自动执行了主构造函数的代码。
2重定义类的toString方法
当你使用println打印类的时候

 println(new Rational(1,2))
 结果为:org.wq.learn.Rational@74a14482

结果不直观,这是因为,使用了缺省的类作为toString定义(object),缺省打印的是类名+@+16进制对象的地址。所以要重载toString方法。在Scala中,你可以使用override来重载方法,和java一样。override要写在def前面哦。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,2))
}
结果为:1/2

3前提条件检测
有理数分母步能为0,这里是d不能为0。前面定义,d为0是可以运行的。怎么解决分母不能为0的问题呢。面向对象编程的一个有点是数据的封装。对于一个有理数的前提条件是分母步为0,Scala中定义了为传入构造方法和方法的参数的限制范围,也就是说调用这些函数或者方法需要满足这些条件。Scala中使用了require的方法(require为Predef对象定义的一个方法,Scala环境自动载入这个类的定义,无需import),因此修改代码为:

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  require(d!=0)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,0))
}
结果为:i am a class construction~1/0
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed

如果分母为0,就抛出IllegalArgumentException异常。
今天加班太累,就休息了……
明天继续……

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42280次
    • 积分:756
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:9篇
    • 译文:4篇
    • 评论:23条
    最新评论