在Xcode中使用swift在子类中更改超类中的变量

时间:2016-02-20 14:40:15

标签: xcode swift inheritance subclass superclass

我有一个名为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 

提前,谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

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

至于继承是否适用于这种情况,肯定可以。例如,您可以说Converter可以是特定函数的通用或抽象执行者,并且特定转换需要不同的实现。例如,货币转换器可能必须咨询外部表,而权重转换器仅需要数学。隐藏实施细节是OO设计的主要目的。

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

此外,为了真正起作用,你需要通用性。你在这里显示字符串,但那些并不是你想要的。任何衡量标准都将是一个价值和一个单位。因此,如果我采取我的体重,它将是一个数字,然后是以磅或千克为单位的天气指标。你可能希望那些可能是Enums。

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

答案 1 :(得分:0)

根据documentation

  

如果这是合适的,您可以访问a的超类版本   方法,属性或下标使用super前缀:

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

  •   
  • 一个名为someProperty的重写属性可以在覆盖的getter或setter实现中访问someProperty的超类版本super.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"]
}