【问题标题】:Changing variable in superclass from subclass using swift in Xcode在 Xcode 中使用 swift 从子类更改超类中的变量
【发布时间】:2016-06-02 04:10:33
【问题描述】:

我有一个名为 Conversion 的超类和一堆子类,即 Weight。我希望从子类中获取一个 String 类型的数组并在超类中使用。我可能会离开这里的继承部分;不能从子类转到超类?

不过,我还是决定问一下,以防万一。

class Conversion: UIViewController{
var List = [""]
//code that uses variable List
}

class Weight: Conversion{
var List = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"]
//Somehow replace variable List in Conversion superclass 

提前感谢您的宝贵时间。

【问题讨论】:

  • 为什么还要在子类中重新声明变量?您可以在 init 函数中设置继承的版本。
  • 你能举个例子吗?我用 init() 尝试了各种不同的方法,但没有成功。
  • 在子类中:init() { List = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"] }。不要这样做var List = …,因为那是在不同的范围内声明另一个变量。

标签: xcode swift inheritance subclass superclass


【解决方案1】:

根据documentation

在适当的情况下,您可以访问超类版本的 使用 super 前缀的方法、属性或下标:

  • 名为someMethod() 的重写方法可以通过在重写方法实现中调用super.someMethod() 来调用someMethod() 的超类版本。

  • 名为someProperty 的重写属性可以在重写getter 或setter 实现中以super.someProperty 的形式访问someProperty 的超类版本。

  • someIndex 的覆盖下标可以从覆盖下标实现中访问与 super[someIndex] 相同的下标的超类版本。

如果需要,您应该在子类属性前面加上 override 以获取此功能。

请注意,您通常不需要这样做,而是可以从超类继承属性并在您自己的 init() 中初始化它:

class Conversion {
  var List = [""]
}

class Weight: Conversion {
  override init() {
    super.init()
    List = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"]
  }
}

使用协议可能更好:

protocol Conversion {
  static var list:[String] { get }
}

class Weight: Conversion {
  static let list = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"]
}

【讨论】:

    【解决方案2】:

    这里有一些问题。首先,如果你打算在这里尝试使用继承,不要将这些类绑定到控制器或 MainClass 层次结构中,而是让它们独立,然后在控制器中使用它们,或者更好的是,首先在控制器中使用它们单元测试。

    至于在这种情况下继承是否适用,当然可以。例如,您可以说转换器可以是特定功能的通用或抽象执行器,并且特定转换需要不同的实现。例如,货币转换器可能必须查阅外部表格,而重量转换器只需要数学。隐藏实现细节是 OO 设计的主要目的。

    但是,从公共基础派生事物或让它们实现公共协议的主要原因是您可以将不同的事物视为相同的事物。当人们问为什么 Java 中有接口时,这通常是最好的答案。在 Swift 中,你有协议。我很想知道为什么重量和货币转换器会受益于通过通用界面进行操作。

    此外,要使其真正起作用,您需要通用性。你在这里显示字符串,但那些真的不是你想要的。任何度量都将是一个值和一个单位。因此,如果我称体重,它将是一个数字,然后是一个以磅或公斤为单位的天气指标。您可能希望那些是枚举。

    最后,如果您希望为相同的操作选择使用不同的转换器,这将是有意义的。例如,有很多方法可以进行货币转换。您可以定义一个协议CurrencyConverter,然后拥有该协议的多个实现,这些实现将在运行时被替换。那里的想法是,您将拥有通过通用协议操作转换器的代码,并且可以添加不同的实现,而无需更改任何正在使用该组件的代码。

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多