抽象類
object s22_abstractClass {
def main(args: Array[String]): Unit = {
var man = new Men
println(man.getId())
println(man.gender, man.name)
}
}
abstract class Person1 {
// 抽象類不能被執行個體化
// 抽象類可以有抽象字段,沒有初始值
// 可以有正常字段和正常方法
var name = "zhangsan"
var gender: String
var age: Int
// 抽象方法沒有方法體
def getId: Int
}
class Men extends Person1 {
// 需要實作抽象字段和抽象方法
var gender = "male"
var age = 24
override def getId() = {
name.hashCode
}
}
輸出
-1432604556
(male,zhangsan)
特質
// 定義一個帶抽象方法的特質
trait Iterator[A] {
// 泛型
def hasNext: Boolean
def next(): A
}
// 定義一個帶實作的特質
trait Consolelogger {
def log(mes: String): Unit = {
println(mes)
}
def log1(mes: String, n: Int): Unit
}
//定義一個類實作特質, 第一個用extends,後面用with
class IntIterator(to: Int) extends Iterator[Int] with Consolelogger {
var curr = 0
override def hasNext: Boolean = curr < to
override def next(): Int = {
if (hasNext) {
log("hasNext")
val t = curr
curr += 1
t
} else -1
}
override def log1(mes: String, n: Int): Unit = {
// 傳入參數需要保持一緻
for (x <- 1 to n) {
println(mes)
}
}
}
object s23_trait {
def main(args: Array[String]): Unit = {
val ite = new IntIterator(10)
while (ite.hasNext) {
println(ite.next())
}
}
}
trait Logger24 {
def log(mes: String)
def warning(mes: String): Unit = {
log("WARNING: " + mes)
}
def info(mes: String): Unit = {
log("INFO: " + mes)
}
}
trait ConLogger extends Logger24 {
override def log(mes: String): Unit = println(mes)
}
trait TimeStamplogger extends ConLogger {
override def log(mes: String): Unit = super.log(s"${java.time.Instant.now()}$mes")
}
trait ShortenLengthLogger extends ConLogger {
val maxLength = 30
override def log(mes: String): Unit = super.log(
if (mes.length <= maxLength) mes
else {
s"${mes.substring(0, maxLength - 3)}..."
}
)
}
class Account {
protected var banlance: Double = 100.0
}
class SavingAccount extends Account with ConLogger {
def withdraw(amount: Double): Unit = {
if (amount > banlance) warning("Insufficient Banlance")
else {
banlance -= amount
info(s"You have withdraw ${amount}")
}
}
}
// 特質可以給類提供可以堆疊的改變
object s24_trait {
def main(args: Array[String]): Unit = {
val ac1 = new SavingAccount with ConLogger with TimeStamplogger with ShortenLengthLogger
val ac2 = new SavingAccount with ConLogger with ShortenLengthLogger with TimeStamplogger
// 混入順序不同對結果的影響
ac1.withdraw(20)
ac2.withdraw(20)
}
}