【发布时间】:2016-08-04 15:06:58
【问题描述】:
有人可以帮我理解这段 Swift 代码吗?根据我目前正在阅读的书,此代码是原型设计模式的实现:
class AbstractCard {
var name: String?
var mana: Int?
var attack: Int?
var defense: Int?
init(name:String?, mana:Int?, attack:Int?, defense:Int?) {
self.name = name
self.attack = attack
self.defense = defense
self.mana = mana
}
func clone() -> AbstractCard {
return AbstractCard(name: self.name, mana: self.mana, attack:
self.attack, defense: self.defense)
}
}
class Card: AbstractCard {
var someNumber: Int
override init(name:String?, mana:Int?, attack:Int?, defense:Int? ){
someNumber = 2
super.init(name: name,mana: mana,attack: attack,defense:
defense)
}
}
// Simulate our client
// This is the card that we will copy
let raidLeader = Card(name: "Raid Leader", mana: 3, attack: 2, defense: 2)
// Now we use our faceless Manipulator card to clone the
let facelessManipulator = raidLeader.clone()
print("\(facelessManipulator.name, facelessManipulator.mana, facelessManipulator.attack, facelessManipulator.defense)")
print(facelessManipulator.dynamicType) // prints "AbstractCard"
如果克隆对象的 dynamicType 仍然是 AbstractCard 而不是 Card,那么这种模式的意义何在。您甚至无法访问特定于 Card 的变量。我尝试将此对象转换为 Card,但出现错误 "Execution was interrupted reason: signal SIGABRT"
【问题讨论】:
-
我认为您需要在
Card中覆盖clone。 -
clone在AbstractCard中的实现有点没有意义,不是吗?因为这只是一个抽象类。
标签: swift design-patterns