Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift:如何将超类中的公共方法重写为子类中的私有方法_Swift_Inheritance - Fatal编程技术网

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。谢谢你的澄清。