swift - 如何将方法标记为“必需”
问题描述
在 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 中不存在此功能。
您不能强制子类覆盖方法。
然而...
你说这是你能找到的最好的代码来实现你想要的,但你不喜欢在运行时移动错误。
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("")
}
}
推荐阅读
- php - 使用foreach循环从表中获取数据的问题
- c++ - ClearCommError():不支持 lpStat?
- python - 在生产中维护鹡鸰
- javascript - 在 Google Drive API v3 中使用 drive.files.copy 通过 nodejs 使用 API 将 Word 文档转换为 Google 文档
- django - 与Django中的自定义表的多对多关系
- javascript - 与方法签名有关的异常错误
- javascript - 使用过滤和优先级以及最小循环将数组转换为对象
- google-chrome - 迁移出 applicationCache (Chrome M82)
- flutter - Android Studio - 无法构建“任务':app:mergeDebugResources'的执行失败。”
- javascript - 试图拆分 emdash(长破折号)但 dtm 不断将其替换为短破折号