说我有BaseClass
,DerivedClassOne
,DerivedClassTwo
,一个神奇的工厂方法giveMeAnObjectOfType(type: String) -> BaseClass
,以及以下代码
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
var anObject : BaseClass
switch type {
case "TypeOne":
// This won't work
anObject = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
anObject.methodOfDCOne()
case "TypeTwo":
// Neither will this
anObject = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
anObject.methodOfDCTwo()
default:
// Throw a tantrum here
}
return anObject
}
这将导致错误,指出anObject不包含methodOfDCOne()
或methodOfDCTwo()
。问题:如何正确投射物体?
基本上,我可以通过在switch的情况下使用几个return语句来达到同样的效果,但我不喜欢它的外观。此外,如果我想调用BaseClass
的某些方法,我会有大量的重复代码。
答案 0 :(得分:0)
anObject.methodOfDCOne()
无法编译,因为methodOfDCOne
不是实例方法
BaseClass
(或其超类)。
您必须首先创建子类类型的对象,以便可以调用子类方法。然后将对象分配(upcast)到基类 变量:
func myBeautifulFunction(index: Int) -> BaseClass {
let type : String = self.someArray[index]
let anObject : BaseClass
switch type {
case "TypeOne":
let dc1 = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
dc1.methodOfDCOne()
anObject = dc1
case "TypeTwo":
let dc2 = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
dc2.methodOfDCTwo()
anObject = dc2
default:
// Throw a tantrum here
fatalError("Unexpected type")
}
return anObject
}