我之前使用的类可以简化为:
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”,它可以在您的类中自由重写,并且您可以添加任意数量的函数来“实现的扩展”。