06. 抽象和接口
2022年5月10日
06. 抽象和接口
1. 抽象类
抽象类的含义就是我们无法具体描述一个类的属性与行为,只是大致知道他会做什么。
我们知道动物,但是不知道动物应该叫什么,动物的当前年龄,动物时如何叫的。犬科的动物又是如何嚎叫的。
但是我们可以准确的知道一匹狼或是一只狗是怎么叫的,在使用时,我只需要让动物叫,而无需关心他是什么动物。
abstract class Animal {
open val name: String = ""
abstract val age: Int
abstract val make: String
abstract fun makeNoise()
}
abstract class Canine : Animal() {
}
class Wolf : Canine() {
override var name = "一匹北方的狼"
override var age: Int = 18
override val make: String="嗷呜呜呜"
override fun makeNoise() {
println(name + "发出了--独属于自己的帅气的" + make + "的叫声")
println("并且")
println(make + "又叫了一次")
println(name + age + "岁了")
}
}
class Dog : Canine() {
override var name = "一只拆家的哈士奇"
override var age: Int = 2
override val make: String="汪汪汪呜呜呜"
override fun makeNoise() {
println(name + "干了错事,只会" + make + "的狗叫")
}
}
fun makeNoise(animal: Animal){
println(animal.makeNoise())
}
fun main(args: Array<String>) {
val wolf: Animal = Wolf()
val dog:Animal=Dog()
makeNoise(wolf)
makeNoise(dog)
}
2. 接口
接口是一个类的附加功能,在需要增加某种能力时,或是我需要某写类有共同的能力,这时使用接口。
举个例子,动物的子类马,马又可以作为交通工具,作为交通工具就是他的一种能力。 汽车也是交通工具,但是汽车绝不是动物.
所以,交通工具是一种附加能力,可以作为接口赋予马或者骆驼。
如下所示:
只是作为动物时,马无法被作为交通工具驾驶。 作为交通工具时,他也不再拥有动物的能力。
//交通工具
interface Transportation{
fun move()
}
//动物
abstract class Animal {
}
//马
class Horse:Animal(),Transportation{
override fun move() {
println("被人骑着跑")
}
}
//汽车
class Car:Transportation {
override fun move() {
println("发动机驱动行驶")
}
}
fun main(args: Array<String>) {
val horse:Animal=Horse()
if (horse is Transportation){
val horseMount:Transportation=horse
horseMount.move()
}
}
3. 抽象类/接口的思考总结
抽象类是模板,他拥有基础的能力,但是又无法完全自我描述。 他需要子类去完善它,让他变得完整。
接口是一种附加能力,或是需要一些类有公共行为。
4. 类,子类,抽象类,接口的创建规则
通过IS-A测试才可以创建子类。
如果需要某个类更具体的版本,并且覆盖或增加新的行为,那么创建一个子类。
需要为子类定义一个模板,确保无法创建该类的对象,使用抽象类。
定义共同的行为,或是需要某个类有额外的功能,使用接口。