当前位置: 首页 > 知识库问答 >
问题:

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

孙光临
2023-03-14

我有一个超级班

class Father {
    public func doSomething() {
    } 
}

我希望这个孩子班级

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

但是Xcode说

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

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

谢谢你

共有2个答案

卫烨烁
2023-03-14

您可以通过使用< 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测试!)

解晟睿
2023-03-14

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

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

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

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

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

let aChild = Child()

unrelatedInstance.operateOnAThing(aChild)

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

 类似资料:
  • 问题内容: 将方法标记为程序包专用类是否有所不同? 之间和此处的可见性是否有实际差异? 问题答案: 如果该类不会被另一个更可见的子类扩展,则唯一的区别是 intent的清晰度* 。将所有方法包都声明为私有,使以后的读者更加难以确定同一包中的其他类将调用哪些方法。 作为我的设计解决方案,这没有多大意义,但是从技术上来说还是有可能的。

  • 我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出:

  • 我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是

  • 在此设置下: 如果我将我的点切改为以下内容: 它的唯一工作方式是在中重写

  • Java代码: 我的问题是:类中的是否重载了超类中同名的? 我的朋友说他们不是因为他们不在一个班。

  • 我有一个主类。应用程序中有许多子类是从类扩展而来的。base类公开公共方法,如下所示: 应用程序将在子实例上调用以获得一个检查器实例。每个子类都可以有自定义的基本检查器和验证检查器。他们可以使用和方法实现它,但是他们不能覆盖基类的,因为它包含处理逻辑。 在这里使用关键字合适吗?