抽象类(Abstract Class)
scala定义抽象类
- 抽象类是不能被实例化的
- 一个含有抽象方法的类必须定义成抽象类,也就是使用abstract关键字来定义类
- 抽象类可以有抽象类型(type)
- 抽象类可以包含抽象字段
- ...............................
下面是一个简单的抽象类的定义
/** * * @param name * @param age */ abstract class Staff(name: String, age: Int) { /** * scala中的抽象字段 */ var _department: String def department: String = _department def department_=(newValue: String): Unit = _department = newValue /** * 定义参数为空,返回值为Unit的抽象方法 */ def doWork(): Unit /** * 抽象方法 * @param value * @return */ def echo(value: String): String def work() = { println("start work") this.doWork() println("work end") } }
下面是对上面父类的继承和实现
/** * 只有子类的主构造器可以调用父类的主构造器 * @param name * @param age * @param address */ class NormalStaff(name: String, age: Int, address: String) extends Staff(name: String, age: Int) { override var _department: String = _ def this(name: String, age: Int) { this(name, age, "UNKNOW"); } // 实现父类的抽象方法 override def doWork(): Unit = { println("I‘m doing some job") } /** * 抽象方法 * 必须使用override关键字 * @param value * @return */ override def echo(value: String): String = value override def toString = "NormalStaff [name=" + this.name + ",age=" + this.age + ",department=" + this._department + "]" }
抽象类的抽象类型
class Food abstract class Animal { type SuitableFood <: Food def eat(food: SuitableFood) } class Grass extends Food class Cow extends Animal { type SuitableFood = Grass override def eat(food: Grass) {} }
使用type关键字定义一个抽象类型,type SuitableFood,并指明他的上界是 Food。
abstract class Abstract { type T def transform(x: T): T val initial: T var current: T } class Concrete extends Abstract { override type T = String override def transform(x: T): T = x + x //在Java里这是final变量,所以必须要初始化赋值 override val initial: T = "string" //在Java里这个private类型变量,在scala中可以yoga下划线赋值 override var current: T = _ }
在这个例子中使用type关键字定义了抽象类型T,在实现类中要覆写并指明抽象类型的具体类型 override type T = String。。
抽象类的抽象字段
abstract class Abstract { type T def transform(x: T): T val initial: T var current: T }
在这里用val和var定义的成员变量都没有初始化,经过scala的编译后的字节码,反编译后在java类里都是抽象方法
C:\WorkSpace5-gitosc\scala-sample\out\production\scala-sample\com\usoft3>javap -p Abstract.class Compiled from "test.scala" public abstract class com.usoft3.Abstract { public abstract java.lang.Object transform(java.lang.Object); public abstract java.lang.Object initial(); public abstract java.lang.Object current(); public abstract void current_$eq(java.lang.Object); public com.usoft3.Abstract(); }
=====================
val initial: T var current: T
对应的java类的抽象方法就是,
public abstract java.lang.Object initial(); public abstract java.lang.Object current();
============================END============================
时间: 2024-10-15 03:47:48