首页 > 解决方案 > 如何将方法标记为“必需”

问题描述

在 swift 中,我可以将初始化程序标记为required,以便派生类必须覆盖它。我怎样才能对普通的实例方法做同样的事情?将其标记为required会引发编译器错误。

class A {
  let a : Int
  required init(a:a) {
    self.a = a
  }
  // compiler error
  required func f() -> Int {
     return 2
  }
}

我能想到的唯一解决方案是这样做:

func f() -> Int {
  fatalError("Should always be overriden")
}

但这并不令人满意,因为它是运行时检查而不是编译时检查。

标签: swiftswift5.1

解决方案


Swift 中不存在此功能。

您不能强制子类覆盖方法。

然而...

你说这是你能找到的最好的代码来实现你想要的,但你不喜欢在运行时移动错误。

func f() -> Int {
    fatalError("Should always be overriden")
}

查看此方法,您似乎想强制子类实现(而不是覆盖)方法。

抽象类

您可能正在寻找类似于其他编程语言中可用的抽象类概念的东西。

基类 + 协议

如果这是您正在寻找的,那么您可以在 Swift 中实现类似的目标。

class AnimalBase {

    let name: String

    init(name: String) {
        self.name = name
    }

}

protocol Animal: AnimalBase {
    func move()
}

现在,如果您尝试定义这样的类

class Dog: Animal {

}

编译器会强制你继承自AnimalBase

class Dog: AnimalBase, Animal {

}

最后提供该move()方法的实现

class Dog: AnimalBase, Animal {

    func move() {
        print("")
    }
}

推荐阅读