[Kotlin] Class / Abstract class / Example

interface Lendable {
    fun borrow()
}

// The properties title, genre, and publicationYear can be included in the parent class because both books and DVDs
// have these properties. The author and length properties however are included only in the child classes.
abstract class InventoryItem(val title: String,
                             val genre: String,
                             var publicationYear: Int,
                             var borrowed: Boolean) : Lendable {

    override fun borrow() {
        if (!borrowed) {
            borrowed = true
        } else {
            println("This item is already borrowed.")
        }
    }

    // If you want, you can also add a returnItem() method so that you can also un-borrow items.


    override fun toString(): String {
        return "InventoryItem(title='$title', genre='$genre', publicationYear=$publicationYear, borrowed=$borrowed)"
    }

    abstract fun copy(): InventoryItem

}

// A book will be not borrowed by default.
// The class is called LibraryBook to prevent name clashes with previous challenges.
class LibraryBook(title: String,
                  val author: String,
                  genre: String,
                  publicationYear: Int) : InventoryItem(title, genre, publicationYear, false) {

    fun read() {
        println("Reading a book by $author...")
    }

    override fun copy(): InventoryItem {
        val copy = LibraryBook(title, author, genre, publicationYear)
        copy.borrowed = this.borrowed

        return copy
    }
}

// A DVD will also be not borrowed by default.
class LibraryDVD(title: String,
                 genre: String,
                 val length: Int,
                 publicationYear: Int) : InventoryItem(title, genre, publicationYear, false) {

    fun watch() {
        println("Watching $title...")
    }

    override fun copy(): InventoryItem {
        val copy = LibraryDVD(title, genre, length, publicationYear)
        copy.borrowed = this.borrowed

        return copy
    }
}
原文地址:https://www.cnblogs.com/Answer1215/p/13802871.html