我有一個可以在線或對抗 AI 的游戲。我有一個類,每個類都包含相同的功能和屬性,但是它們的功能顯然不同。
class Game { ... }
class GameAI: Game { ... }
class GameOnline: Game { ... }
在我的 ViewController 中,我有一個變數“游戲”,無論“游戲”是 GameAI 還是 GameOnline 型別(因為函式和屬性名稱相同),它都可以作業,并且更改這個游戲變數將是一切正常作業的一種非常優雅的方式。
目前游戲變數如下:
var game = GameAI()
當在線游戲開始時,我想將其更改為 GameOnline,如下所示:
extension MainViewController: OnlineViewControllerDelegate {
func onlineGameDidStart(player: Int, gameCode: String) {
game = GameOnline()
}
}
然而,這是不可能的,因為變數已經是“GameAI”型別。
任何幫助都會很棒!
uj5u.com熱心網友回復:
當你在 Swift 中宣告一個屬性或變數時,你可以像這樣宣告它:
var/let propertyName: PropertyType = InitialValue
有一個糖果可以省略,然后通過假設初始值可以定義它來PropertyType隱式確定。InitialValue
所以你可以擁有
var/let propertyName = InitialValue
在您的情況下,您省略了屬性型別,Swift 決定使用它,GameAI因為這是您作為初始值傳遞的。
要解決此問題,您要么需要明確指定屬性型別,要么需要更改初始值。因此,以下任何一項都應該起作用:
var game: Game = GameAI()
var game = GameAI() as Game
從評論看來,關于子類化存在一些混淆。
僅僅在子類中實作方法是不夠的。您還需要在基類中定義它。像這樣:
class Game {
func beginGame() {
print("A new game started")
}
}
class GameAI: Game {
override func beginGame() {
super.beginGame()
print("It is an AI game")
}
}
class GameOnline: Game {
override func beginGame() {
super.beginGame()
print("It is an online game")
}
}
請注意,甚至Game實作了此方法,而它們的子類僅覆寫方法。呼叫super.beginGame()是可選的。如果您想添加功能(保留基類邏輯),您可以呼叫它,否則您可能只是覆寫所有邏輯。
另一種方法是使用協議。協議不能用于創建實體,因此無需在基類中宣告任何內容。您的情況的其余部分可能保持不變:
protocol Game {
func beginGame()
}
class GameAI: Game {
func beginGame() {
print("An AI game started")
}
}
class GameOnline: Game {
func beginGame() {
print("An online game started")
}
}
協議基本上是一個藍圖,它強制與您的協議對應的所有類實際實作該邏輯。如果您嘗試在此協議中添加另一個方法,您將收到兩個類再次需要實作此新方法的錯誤。
要給出一個更有趣的協議示例,您可以使用以下方法:
protocol Game {
var id: String { get }
var startTime: Date { get }
func beginGame()
func gameDescription() -> String
}
extension Game {
func gameDescription() -> String {
return "A game with id \(id) started \(Int(Date().timeIntervalSince(startTime))) seconds ago"
}
}
class GameAI: Game {
let id: String = UUID().uuidString
let startTime: Date = .init()
func beginGame() {
print("AI game with id \(id) is starting")
}
}
class GameOnline: Game {
let id: String
let startTime: Date = .init()
init(id: String) { self.id = id }
func beginGame() {
print("Online game started with id \(id)")
}
func gameDescription() -> String {
return "Overridden game description"
}
}
如果您在游戲類中添加更多代碼,我可以提供一個更真實的示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416016.html
標籤:
上一篇:Swift類繼承初始化程式錯誤
下一篇:按自定義順序運行Pytest類
