我想创建一个必须由子类重写的函数,但该函数不可用。例如。
open class Animal {
func favFood() throws -> String {
throw UnImplementedError()
}
func eatFood() throws {
print("Yum, I love \(try favFood())")
}
}
class Cat: Animal {
override func favFood() throws -> String {
return "fish"
}
}
let cat = Cat()
try cat.eatFood() // I want this method to be available
try cat.favFood() // I want to prevent people from using this method
我看到了一个使用 fileprivate 的解决方案。但就我而言,将所有重写方法保留在同一个文件中没有逻辑意义。我还想允许任何模块覆盖 Animal,但强制它们实现 favFood()
允许子类访问/覆盖函数,但不允许 swift 中同一模块中的任何其他类访问/覆盖函数
我猜,一个可能的解决方案是在 Animal 类中创建一个初始化程序,以强制子类将“favFood”作为参数传递。但是,如果我有许多需要重写的函数,这可能会变得混乱。或者必须在创建对象之后调用该方法。
虽然不是一个完美的解决方案,但我认为你可以用
@available(*, unavailable)
来做到这一点。所以我上面的 Cat 类示例将更改为:
class Cat: Animal {
@available(*, unavailable)
override func favFood() throws -> String {
return "fish"
}
}
这意味着子类有责任阻止它被使用,但总比没有好。