1. 程式人生 > 實用技巧 >[Kotlin] Class / Abstract class / Example

[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 } }