如何将方法标记为“必需”

How can I mark a method `required`

在 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")
}

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

此功能在 Swift 中不存在。

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

然而...

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

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

看看这个方法,你似乎想强制一个子class来实现(而不是覆盖)一个方法。

摘要Class

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

基础Class + 协议

如果这正是您要寻找的,那么您可以在 Swift.

中实现类似的目标
class AnimalBase {

    let name: String

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

}

protocol Animal: AnimalBase {
    func move()
}

现在,如果您尝试像这样定义 class

class Dog: Animal {

}

编译器会强制你继承自AnimalBase

class Dog: AnimalBase, Animal {

}

最后为 move() 方法

提供一个实现
class Dog: AnimalBase, Animal {

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

您误解了 required 的意思。 required 不会强制您覆盖初始化程序,它需要初始化程序 存在 .

初始化器并不总是被继承的。例如,如果您创建一个新的指定构造器,那么超类构造器将不会被继承。 required 在这种情况下,初始化程序会强制您定义一个。

普通方法不会发生这种情况,因为它们总是被继承的。这就是 required 方法不存在的原因。

您正在寻找 abstract(或 C++ 中的 pure virtual)方法,这是 [=28 中不存在的概念=].