Scala OOP 基础一

2017/11/10 Scala

Scala OOP 基础知识一

Scala 是一个函数式编程语言,也是一个面向对象的编程语言。Scala 在架构层面上提倡的方法是:小处用函数式编程,大处用面向对象编程。。用函数式实现算法、操作数据,以及规范地管理状态,是减 少 bug、压缩代码行数和降低项目延期风险的最好方法。 类用关键字 class 声明,而单例对象用关键字 object 声明。在类声明之前加上关键字 final ,可以避免从一个类中派生出其他类。也可以使用sealed 关键字。abstract 关键字可以阻止类的实例化。

和Java的差别

  1. 没有样板函数,没有类似与setter和getter的东西,如
     class AA{
         private String a;
         private int b;
    
         public AA(String ia,int ib){
             this.a=ia;
             this.b=ib;
         }
    
         public String geta(){return a;}
         public void seta(String ia){this.a=ia;}
    
         public int getb(){return b;}
         public void setb(int ib){this.b=ib;}
    
     }
    

    Scala中只需要

     class AA(var a:String, var b:Int,val c:Double) //c是不可变参数
    

    从这个特征来看,scala比java简洁很多。

  2. scala的重载包括函数的返回值 这点同java,C++差异较大,这样可以带来更大的灵活性。但是在使用”高级类型”的时候会不同。如
     Object c{
         def m(seq:Seq[Int]):Unit = println(s"Seq[Int]: $seq")
         def m(seq:Seq[String]):Unit = println(s"Seq[String]: $seq")
     }
    

    这种情况会出错,因为Int和String是类型参数化的一种补充机制,主要是提供可读性,但是不是数据类型。scala中”高级类型”具有类型擦除机制,”高级类型”是指包含类型参数的类型。

  3. 如果方法有参数,可以和成员就是同名。如:
     class B{
         val x:Int
         def x:Int //error 
     }
    

    但是这种是合法的

     class B{
         val x:Int
         def x(i:Int):Int//ok
     }
    
  4. scala中没有静态成员 如果一个class和Object名称相同且在同一个文件中,它们就是伴随关系。
  5. case 修饰的类自动生成伴随对象

  6. scala 中没有interface
    scala 中也有继承关系,从函数式语言中汲取了trait。java8之前你不可以在interface中定义方法,但是可以声明。trait允许真正意义上的组合行为。例如处理程序的日志。
class SomeService(cnt:String){
    def work(i:Int):Int={
        println(s"done something $i")
        i+1
    }
}

trait Logging{
    def info (msg:String):Unit
    def warn (msg:String):Unit
    def err (msg:String):Unit
}

trait StdLogging extends Logging{
    def info (msg:String) = println(s"INFO $msg")
    def warn (msg:String) = println(s"WARN $msg")
    def err (msg:String) = println(s"ERR $msg")
}

val service1=new SomeService("one")
(1 to 3) foreach (i => println(s"Result:${service1.work(i)}"))

val service2=new SomeService("two") with StdLogging{
    override def work(i:Int):Int={
        info(s"start work:i=$i")
        val res=super.work(i)
        info(s"end work:i=$i,result=$res")
        result
    }
}
(1 to 3) foreach (i => println(s"Result:${service2.work(i)}"))

这里可以直接”混入”trait给某个对象,或者也可以派生新的类。 (ps. (s”“)是可插入字符串,scala提供的非常强大的字符串工具,可以将其中的内容替换,如 val name="ethan";println(s"hello,$name"); )

Scala main 函数

第一次写scala程序的时候,可以主函数会写的有问题。放一个正确的示例。

Object WhateverNames{
    def main(args: Array[String]) :Unit ={
        println("Hello World!")
    }
}

明天写OOP基础知识的第二部分内容,scala是门很强大的语言,OOP部分比java的强大很多。

Show Disqus Comments

Search

    Table of Contents