我有超级课程
class Father {
public func doSomething() {
}
}
我希望这个子课程
class Child: Father {
private override func doSomething() {
}
}
但是Xcode说
重写实例方法必须与声明一样可访问 覆盖
那么,如何在超类中覆盖公共方法是子类中的私有方法
谢谢你
答案 0 :(得分:11)
你不能因为那会违反Liskov Substitution Principle。
基本上,任何可以在超类实例上运行的代码也必须能够在子类的实例上运行。
所以,如果其他一些类有方法
class Unrelated {
func operateOnAThing(_ someThing:Father) {
someThing.doSomething()
}
}
然后,当您执行以下操作时,它仍然必须工作:
let aChild = Child()
unrelatedInstance.operateOnAThing(aChild)
如果doSomething
方法在Child
类中具有更严格的访问权限,那么您将收到运行时错误。为了防止这种情况,您不能在子类中使访问更具限制性。
答案 1 :(得分:1)
您可以通过使用unavailable
属性将公用方法标记为@available
来实现。然后,在私有方法中使用super
调用该方法。
示例:
class Father {
public func doSomething() {
print("doSomething privatly")
}
}
class Child: Father {
@available (*, unavailable)
override func doSomething() {
}
fileprivate func internal_doSomething() {
super.doSomething()
}
}
Child().internal_doSomething()
Child().doSomething() //'doSomething()' has been explicitly marked unavailable
(已通过Swift 4.0测试!)