risc-v中文社区

 找回密码
 立即注册
查看: 1086|回复: 1

[原创] risc-v开发基础 Scala 抽象类型和抽象成员---(20)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-13 09:08:27 | 显示全部楼层 |阅读模式
scala中有抽象方法,抽象字段,抽象类型,举一个例子:
trait AbstractTrait {
  type T
  def method(arg:T):T
  val v1:T
  var v2:T
}
abstract class AbstractClass {
  type T
  def method(arg:T):T
  val v1:T
  var v2:T
}
有抽象成员,则此class或trait肯定必须通过子代实现这些抽象成员
class ConcreteTrait extends AbstractTrait {
  type T = String
  def method(arg:String) = "hello " + arg
  val v1:String = "v1 value"
  var v2:String = v1
}
抽象类型指由type关键字声明,不带具体定义的类或特质的成员的类型,如上面type T.抽象字段如val v1:T和var v2:T,指定了val和var的名称和类型,但不指定值,抽象val可以重定义父中的抽象def成员:
trait AbstractTrait {
  type T
  def method(arg:T):T
  def m:T
  val v1:T
  var v2:T
}
abstract class Abstractclass extends AbstractTrait {
  val m:T  //抽象val重定义抽象def
}

class ConcreteAbstractclass extends  Abstractclass {
  override type T = Int
  override val m: T = 100
  override def method(arg: T): T = 111

  override val v1: T = 10
  override var v2: T = v1
}
class ConcreteTrait extends AbstractTrait {
  type T = String
  def method(arg:String) = "hello " + arg
  def m:String = "ConcreteTrait"
  val v1:String = "v1 value"
  var v2:String = v1
}
class ConcreteTrait2 extends AbstractTrait {
  type T = Int
  def method(arg:T) = 2 * arg
  def m:T = 100
  val v1:T = 12
  var v2:T = v1
}
主main中:
    val m = new ConcreteAbstractclass()
    println(m.m)
    val c = new ConcreteTrait2
    println(c.method(1))
    val c1 = new ConcreteTrait
    println(c1.m)
显示如下:
100
2
ConcreteTrait


回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-13 09:22:38 | 显示全部楼层
实际上申明了抽象var成员(var v2:T),那就是隐式地申明了抽象getter/setter方法及相应的v2和v2_=,
子代中初始化抽象val成员对于父是trait来说很有意义,因为trait缺少能够传递参数的构造器。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 01:13 , Processed in 0.025583 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表