继承类[Swift]中类func()的奇怪歧义
我在Swift中有一个简单的类层次结构继承类[Swift]中类func()的奇怪歧义,swift,inheritance,swift5,Swift,Inheritance,Swift5,我在Swift中有一个简单的类层次结构 class Parent { var name:String = "Unnamed" class func all() -> [Parent] { return Dad.all() + Mom.all() } } class Dad:Parent { static var AllDads:[Dad] = [] class func all() -> [Dad] { re
class Parent {
var name:String = "Unnamed"
class func all() -> [Parent] {
return Dad.all() + Mom.all()
}
}
class Dad:Parent {
static var AllDads:[Dad] = []
class func all() -> [Dad] {
return AllDads
}
}
class Mom:Parent {
static var AllMoms:[Mom] = []
class func all() -> [Mom] {
return AllMoms
}
}
Mom.all().forEach { mom in
print(mom.name)
}
如果我把它放在一个工作区,在我点击run按钮之前,一切都很好。这时它告诉我最后一个表达式
Mom.all()
是不明确的。为什么会这样?有没有办法让一个类func在子类中细化子类型,并保持它们的明确性?直到您实例化一个Mom,并在该Mom实例上调用它,它将是不明确的。原因是父上的all
和Mom
上的all
具有不同的签名。因此,Mom
上的all
不能作为Parent
上的覆盖(编译器不需要override
关键字这一事实也表明了这一点)。这意味着Mom
类型上存在两个名为all
的类函数。此外,传递给forEach
的闭包没有指定参数类型,因此无法确定引用了这两个函数中的哪一个。将类型指定给forEach
中的mom
参数将解决此问题。将方法命名为动词短语(getAll
),将属性命名为名词,以避免奇怪的大小写。是的,现在有意义了。一旦我将
中的mom改为(mom:mom)
,一切都很好。