Scala講座:面向對象和函數式的特點總結
這篇是Scala講座第七篇的第五部分,通過比較命令式、面向對象式和函數式編程的例子來闡述了他們的特點。一句話,可以從兩個方面來說明“面向對象式”和“函數式”。
Scala講座 表:模塊層次與方法層次
#t#從分治法概念上來說,可以分為兩個軸上的問題,分別為模塊層次上的面向對象還是函數式,以及方法層次上的命令式還是函數式。從Java語言來說在模塊上是面向對象,在方法上是命令型。從Haskell語言來說模塊和方法層次上都是函數式。
那么說到Scala語言,他在模塊層次上既可以用面向對象又可以用函數式,在方法層次上既可以用命令又可以用函數式方法描述。例如可以在模塊層次上用面向對象,在方法層次上用命令式來描述。筆者個人覺得,在模塊層次上用面向對象方式則比較容易理解,在方法層次上用函數式則在很多情況下代碼會變得很簡單。
通過這次學習,說明了一下很可能成為函數式編程的障礙的基本思考方法。Scala有趣的地方是,它不僅可以用函數式方法來編程,用傳統的面向對象和命令式方法也行的特點。應此剛開始即使沒有“函數腦”也可以享受他的好處。
***盡筆者所能寫了一個將函數式和面向對象式編程方法混在一起的程序。感覺上是使用了函數式的函數,然后在上面蓋上類,然后再使用多態技術。這個程序雖然沒有實用性,但是可以感覺到由于有了Scala這類有趣的語言將來可能會誕生混合了“函數式”和“面向對象式”特點的創意或模式。
- case class Person(val name:String, val num:Int){
- def say = {
- "[" + num + "] "
- }
- def introduceMySelf = {
- "My name is " + name
- }
- }
- case class Sekaino(override val name:String, override val num:Int) extends Person(name, num){
- override def say = {
- num match {case 3 => "[Sir]"
- case _ => super.say
- }
- }
- }
- object Count{
- def main(args:Array[String]):Unit = {
- val persons = (1 until 5).map(x => factory(args(0), x))
- persons.foreach(show)
- }
- def show(person:Person) :Unit = {
- println(person.introduceMySelf)
- println(person.say)
- }
- def factory(name:String, num:Int) = {
- name match {
- case "nabe" => Sekaino(name, num)
- case _ => Person(name, num)
- }
- }
- }
順便說明一下,內容為數一下執行結果的個數,只有3才打印。
#p#
C:\ scalatest>scalac Count.scala
C:\scalatest>scala Count ushio
My name is ushio
[1]
My name is ushio
[2]
My name is ushio
[3]
My name is ushio
[4]
C:\scalatest>scala Count nabe
My name is nabe
[1]
My name is nabe
[2]
My name is nabe
[Sir]
My name is nabe
[4]
到這里,Scala講座第七篇的內容終于結束了。對于Scala語言的面向對象式和函數式的特點,你是否了解了呢?
【編輯推薦】