抽象类和接口之一

/**
  * Created by jack on 2017/8/1.
  */

trait Abstract {
  type T

  def transform(x: T): T

  val initial: T
  val current: T

  def display:T
}

class Concrete extends Abstract {
  override type T = String

  override def transform(x: T): T = {
    x + x
  }

  override val initial: T = "init"
  override val current: T = "current"

  override def display: String = current
}

class Concrete1 extends Abstract {
  override type T = Int

  override def transform(x: Int) = {
    x
  }

  override val initial = 0
  override val current = 12

  val display: Int = current
}

object AbstarctMP extends App {

  val x = new Concrete()
  println(x.transform("hello"))

  val y = new Concrete1()
  println(y.display)
}
 
总结上述代码:
1、对于一个class或者一个trait来说,如果其中的某一个“成员”没有具体的实现,那么这个类就是抽象的
2、对于抽象类的子类,如果接trait或者class的变量为val,那么在其实现的类中该变量是不变的
3、对于抽象方法的定义,在其子类的实现中,该方法可以被同名的变量重写,并且该变量可以是var也可以是val
4、对于var类型的变量,其默认会生成get和set方法,如下:
object AbstarctMP extends App {

  val tmp = new a
  tmp.x_=("world")
  println(tmp.x)
}

class a {
  var x: String = "hello"
}
在上面的方法中一定要注意的是在调用set方法,形如<name>_的时候必须要加上(),否则编译就会出错,
因为对于set的方法其具体的实现如下:
def x_=(s:String) = x=s,这里x_就是一个方法的名称,在其和第一个等号后面一定不可以加“空格”
第一个等号后面跟的是一个函数((s:String) = x=s),这是有名称的函数定义的方法(当让相对还有匿名的函数,
最常见的就是(x:Int,y:Int)=>(x+y)),左边的括号表示输入的参数等号右边表示函数体,省略了{},函数体表示将s赋值给x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值