swift:如何将超类中的公共方法重写为子类中的私有方法
我有一个超级班swift:如何将超类中的公共方法重写为子类中的私有方法,swift,inheritance,Swift,Inheritance,我有一个超级班 class Father { public func doSomething() { } } 我希望这个儿童班 class Child: Father { private override func doSomething() { } } 但是Xcode说 重写实例方法必须与它的声明一样可访问 覆盖 那么,我如何在超类中重写公共方法,而在子类中重写私有方法呢 谢谢你你不能这样做,因为那样会违反法律 本质上,任何可以操作超类实例的代码也必须能够
class Father {
public func doSomething() {
}
}
我希望这个儿童班
class Child: Father {
private override func doSomething() {
}
}
但是Xcode说
重写实例方法必须与它的声明一样可访问
覆盖
那么,我如何在超类中重写公共方法,而在子类中重写私有方法呢
谢谢你你不能这样做,因为那样会违反法律 本质上,任何可以操作超类实例的代码也必须能够操作子类的实例 所以,如果其他类有一个方法
class Unrelated {
func operateOnAThing(_ someThing:Father) {
someThing.doSomething()
}
}
当您执行以下操作时,它仍然必须工作:
let aChild = Child()
unrelatedInstance.operateOnAThing(aChild)
如果
doSomething
方法在Child
类中具有更严格的访问权限,则会出现运行时错误。为了防止这种情况发生,您不能在子类中设置更严格的访问限制。您可以通过使用@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测试!)非常感谢,我不希望任何人从孩子那里访问doSomething(),而父亲有公共方法doSomething(),有什么办法让我高兴吗?你可以有两种方法
doSomething
和一种私人方法reallydosmething
。在超类中,doSomething
将调用reallyDoSomething
。在子类中,doSomething
将抛出异常或其他内容。子类可以有任何的实现reallyDoSomething
是合适的事实上我知道这是可行的,但我不想这样,有人可能会在Child中调用doSomething,再次非常感谢,这可能是唯一的方法;你看到问题了。必须有人能够对Child的实例调用doSomething
,因为根据我的示例,他们可能甚至不知道自己正在对Child实例进行操作。如果您尝试在Child
的实例上显式调用该方法,则会出现编译器错误,但实际上它不会将Child方法设为私有-如果您通过类型为父变量的变量
-请参阅@Paulw11。谢谢你的澄清。