C#程序员的Scala之路第三章(类和对象)

1. 类,字段,方法

Scala 里定义类的方式是class,下面我们就定义一个sum类

object Hello extends App {
  class MathSum {
    private var sum = 0
    def add(b:Byte):Unit= {
      sum +=b
    }
  }
}

Add 方法用来累加sum变量

让我们来优化一下上面的代码吧,使他变得更加函数式一点

object Hello extends App {
  class MathSum {
    private var sum = 0
    def add(b: Byte) { sum += b }
  }
}

2.Singleton对象

Scala比java更加面向对象的一个方面是Scala没有静态成员。但是它提供了单例对象:singleton object 。除了用object关键字替换class关键字以外,单例对象的定义看上去就像类的定义。

object MathSum{
   private val addValue = 1
}

当单例对象与类名一样的时候,他被称为伴生对象(companion object),必须在一个源文件里定义伴生对象,类被称之为伴生对象的伴生类:

object MathSum{
   private val addValue = 1
   val publicValue = 100
}

class MathSum {
    private var sum = 0
    def add(b: Byte) { sum += b + MathSum.addValue  }
    def printSum() { println(sum)}
  }

object Hello extends App {
  val ms = new MathSum
  ms.add(1)
  ms.printSum()
  println(MathSum.publicValue)
}

在上面我们定义了伴生对象的2个属性,一个为私有的,一个为公有的,在伴生类中可以访问私有的与公有的。但是在伴生类与伴生对象之外只能访问公有的。

而单列类的用法却没在上面的代码中体现出来,下面是我修改后的代码

object MathSum{
   private val addValue = 1
   val publicValue = 100
   private val ma = new MathSum()
   def getAdd(value : Int):Int ={ ma.add(value);ma.sum} 
}

class MathSum {
    private var sum = 0
    def add(b: Int) { sum += b + MathSum.addValue  }
    def printSum() { println(sum)}
  }

object Hello extends App {
  println(MathSum.getAdd(100))
  println(MathSum.getAdd(1))
  println(MathSum.publicValue)
}

上面再Math伴生对象中去使用MathSum的伴生类,这就是一个典型的单例模式。

总结:Scala的伴生对象是为了替换静态而出现的,静态不应该出现在面向对象中,因为静态是死的,而对象是活的,所以Scala比java,C#更加面向对象。

(详见Scala编程)

 

你可能感兴趣的:(scala)