抽象类是无法实例化的类。我们创建抽象类,为其他类提供扩展和使用的通用模板。
声明一个抽象类
您可以使用abstract关键字声明一个抽象类-
abstract class Vehicle
抽象类可以包含抽象和非抽象属性和函数。您需要显式使用abstract关键字将属性或函数声明为抽象 -
abstract class Vehicle(val name: String,
val color: String,
val weight: Double) { // Concrete (Non Abstract) Properties
// Abstract Property (Must be overridden by Subclasses)
abstract var maxSpeed: Double
// Abstract Methods (Must be implemented by Subclasses)
abstract fun start()
abstract fun stop()
// Concrete (Non Abstract) Method
fun displayDetails() {
println("Name: $name, Color: $color, Weight: $weight, Max Speed: $maxSpeed")
}
}
扩展抽象类的任何子类都必须实现其所有抽象方法和属性,或者子类也应声明为抽象类。
如果您从Kotlin继承教程中回忆一下,您需要注释一个类open以允许其他类继承它。但是,您不需要使用抽象类。open默认情况下,抽象类用于扩展。
同样,open默认情况下,抽象方法和属性用于覆盖。
但是,如果需要覆盖非抽象方法或属性,则必须使用open修饰符对其进行标记。
从Abstract类扩展
以下是两个扩展Vehicle抽象类并覆盖其抽象方法和属性的具体类-
class Car(name: String,
color: String,
weight: Double,
override var maxSpeed: Double): Vehicle(name, color, weight) {
override fun start() {
// Code to start a Car
println("Car Started")
}
override fun stop() {
// Code to stop a Car
println("Car Stopped")
}
}
class Motorcycle(name: String,
color: String,
weight: Double,
override var maxSpeed: Double): Vehicle(name, color, weight) {
override fun start() {
// Code to Start the Motorcycle
println("Bike Started")
}
override fun stop() {
// Code to Stop the Motorcycle
println("Bike Stopped")
}
}
现在让我们编写一些代码来测试main方法中的抽象和具体类 -
fun main(args: Array) {
val car = Car("Ferrari 812 Superfast", "red", 1525.0, 339.60)
val motorCycle = Motorcycle("Ducati 1098s", "red", 173.0, 271.0)
car.displayDetails()
motorCycle.displayDetails()
car.start()
motorCycle.start()
}
以下是上述main()方法的输出-
# Output
Name: Ferrari 812 Superfast, Color: red, Weight: 1525.0, Max Speed: 339.6
Name: Ducati 1098s, Color: red, Weight: 173.0, Max Speed: 271.0
Car Started
Bike Started
结论
抽象类可帮助您将常用功能抽象到基类中。它可能包含抽象和非抽象属性和方法。抽象类本身是无用的,因为您无法从中创建对象。但是,其他具体(非抽象)类可以扩展它并在其基础上提供所需的功能。
领取专属 10元无门槛券
私享最新 技术干货