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

时间:2016-04-16 05:49:47

标签: swift inheritance

我有超级课程

class Father {
    public func doSomething() {
    } 
}

我希望这个子课程

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

但是Xcode说

  

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

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

谢谢你

2 个答案:

答案 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测试!)