Swift:如何创建不可调用的重写函数

问题描述 投票:0回答:1

我想创建一个必须由子类重写的函数,但该函数不可用。例如。

open class Animal {
  func favFood() throws -> String {
    throw UnImplementedError()
  }

  func eatFood() throws {
    print("Yum, I love \(try favFood())")
  }
}

class Cat: Animal {
  override func favFood() throws -> String {
    return "fish"
  }
}

let cat = Cat()
try cat.eatFood()  // I want this method to be available
try cat.favFood()  // I want to prevent people from using this method

我看到了一个使用 fileprivate 的解决方案。但就我而言,将所有重写方法保留在同一个文件中没有逻辑意义。我还想允许任何模块覆盖 Animal,但强制它们实现 favFood()

允许子类访问/覆盖函数,但不允许 swift 中同一模块中的任何其他类访问/覆盖函数

我猜,一个可能的解决方案是在 Animal 类中创建一个初始化程序,以强制子类将“favFood”作为参数传递。但是,如果我有许多需要重写的函数,这可能会变得混乱。或者必须在创建对象之后调用该方法。

swift inheritance
1个回答
0
投票

虽然不是一个完美的解决方案,但我认为你可以用

@available(*, unavailable)
来做到这一点。所以我上面的 Cat 类示例将更改为:

class Cat: Animal {
  @available(*, unavailable)
  override func favFood() throws -> String {
    return "fish"
  }
}

这意味着子类有责任阻止它被使用,但总比没有好。

© www.soinside.com 2019 - 2024. All rights reserved.