我之前使用的类可以简化为:

class Whatever {

  var someArray = [Int]()

  func unchangingFunction {
    print("test")
  }

  func functionForOverride() {}

}

我在想办法改善这一点,但我被告知,与其说是继承,不如说是组合,具体做法如下:
protocol Implementation {
  func functionForOverride()
}

final class Whatever {

  var someArray = [Int]() // How can I access this?

  let implementation: Implementation

  init(implementation: Implementation) {
    self.implementation = implementation
  }

  func unchangingFunction() {
    print("test")
  }

  func functionForOverride() {
    implementation.functionForOverride()
  }

}

但是,有了这个,我找不到对somerarray数组执行任何操作的方法:
struct Something: Implementation {

  func functionForOverride() {
    print(someArray) // This cannot work
  }

}

有了最初的代码,我可以随意访问和修改某个数组,但是有了这种新方法,我想不出一个简单的解决方案。

最佳答案

如果“Implementation”需要“somerarray”来完成它要做的事情,那么应该让“Implementation”要求符合它的任何对象也声明“somerarray”
这样地:

protocol Implementation {
    var someArray: [Int]
}

如果你知道你想用“someFunction”做什么,那么你可以给它一个默认的实现,协议扩展如下:
extension Implementation {
    func someFunction() {
        //you can do some stuff with someArray here
    }
}

然后,当符合“Implementation”时,需要声明“somerarray”,而不是“someFunction”,除非要重写默认函数。
例如。
class MyClass: Implementation {
     var someArray: [Int]!

     init() {}
}

注意,MyClass现在可以访问“someFunction”,它可以在您的类中自由重写,并且您可以添加任意数量的函数来“实现的扩展”。

10-07 20:43