提问者:小点点

swift:如何将超类中的公共方法重写为子类中的私有方法


我有一个超级班

class Father {
    public func doSomething() {
    } 
}

我希望这个孩子班级

class Child: Father {
    private override func doSomething() {
    }
}

但是Xcode说

重写实例方法必须与它重写的声明一样可访问

那么,我如何覆盖超类中的公共方法是子类中的私有方法

谢谢你


共2个答案

匿名用户

你不能这样做,因为这违反了利斯科夫替换原则。

本质上,任何可以对超类实例进行操作的代码也必须能够对子类的实例进行操作。

所以,如果其他类有一个方法

class Unrelated {
    func operateOnAThing(_ someThing:Father) {
        someThing.doSomething()
    }
}

然后,当您执行以下操作时,它仍然必须工作:

let aChild = Child()

unrelatedInstance.operateOnAThing(aChild)

如果< code>doSomething方法在< code>Child类中具有更严格的访问权限,那么您将会得到一个运行时错误。为了防止这种情况,您不能在子类中进行更严格的访问。

匿名用户

您可以通过使用< code>@available属性将公共方法标记为< code>unavailable来实现这一点。然后,在私有方法中使用< code>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测试!)