我正在制作一個簡單的游戲來學習一些 kotlin,但我對使用 OOP 改變這一點的最佳方法有點困惑。
我有一個用于背包設定的類,因此它有另一個名為 items 的類,它將是不同型別的專案。下面我重新創建了我所擁有的一個簡單版本。
class backPack {
private val item: Item
init { item = Item() }
fun display() {
item.display()
}
}
class Item {
fun display() { println("Your item!") }
}
fun main() {
val examplePack = backPack()
examplePack.display()
}
我想更改 backPack 類以允許使用不同型別的專案。例如,健康藥水和法力藥水。我考慮過把這個專案變成一個公開課,然后有這樣的東西:
class healthPotion : Item() {
override fun display() {
println("health potion!")
}
}
class manaPotion : Item() {
override fun display() {
println("mana potion!")
}
}
這似乎是正確的,但我有點堅持如何重構背包類以允許不同型別的物品,我想確保這似乎是一種正確的方法。非常感謝任何幫助,謝謝!
uj5u.com熱心網友回復:
基本上就是這個想法!如果您的BackPack類(按照慣例應該以大寫字母開頭)處理Items,那么任何具有該型別的類都可以作業。您有兩個選擇 - 繼承和組合。
繼承是您構建類層次結構的地方,例如:
open class Item {
val weight: Int
fun Describe()
}
open class Potion : Item() {
fun drink() {}
}
// this is a Potion, and a Potion is an Item, meaning this is an Item
class ManaPotion : Potion() {
override fun drink() {
println("whoa!")
}
}
// etc
問題是你被鎖定在一個僵化的層次結構中——如果你有 a StaleBreadthat's a Food,但你也希望它是 aWeapon怎么辦?您可以使用介面來組合您的物件,方法是為其提供多種型別,而不僅僅是父物件:
open class Item
interface Food {
fun eat() {
println("yum")
}
}
interface Weapon {
fun attack() {
println("RARGH")
}
}
class StaleBread : Item(), Food, Weapon
因為StaleBread具有所有這些型別,所以您可以將其視為其中任何一個,因為它是所有這些型別。因為它是 a Weapon,所以保證有一個attack()方法等。你可以將它添加到 a List<Food>,因為它is是 a Food。能夠將物件視為不同的型別稱為多型性。因此,您可以組合不同型別的物件,為其賦予某些屬性、某些行為等
您的示例應該按原樣作業,因為您正在處理Item背包中的 s ,并且您的兩個藥水類都是Items (該類的后代,具體來說,因為您是從Item該類繼承的)。有很多方法可以組織它——如果你學習一些關于繼承、組合和多型性的教程(這只是一個簡單的概述,跳過了一堆東西)你會開始對如何前進有一些想法
哦,是的,對于實際的背包,你可能想要這樣的東西:
class BackPack {
private val items = mutableListOf<Item>()
fun addItem(item: Item) {
// here you could do things like check it doesn't exceed the allowed weight
// or capacity of the backpack
items.add(item)
}
}
這樣,你的背包可以包含多個Items,你可以通過類的函式和屬性來控制它們的訪問方式。任何Item型別的東西都可以進去!
uj5u.com熱心網友回復:
如果您希望能夠更改包中的物品,則該屬性應為var. 如果您希望包能夠為空,那么它應該是一個可為空的屬性(?在型別之后用 a 宣告,以便它可以容納空)。
順便說一句,類名應該總是以大寫字母開頭,這樣你的代碼會更容易閱讀。您可以在宣告站點初始化屬性,而不是使用單獨的init塊。
class Backpack {
var item: Item? = null
fun display() {
item?.display()
}
}
您的泛型Item()似乎在實踐中沒有用。因此,Item 可能應該是 anabstract class或 an interface。一個通用的 OOP 原則是您應該避免深層類層次結構。如果您的超類不包含必須由所有子類共享的邏輯,則它可能應該是一個介面。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477516.html
