我有一个以这种格式构建的相当大的项目:
class One : FirstThree {
fileprivate var integers: [Int] {
return [1, 2, 3, 101, 102]
}
override func allIntegers() -> [Int] {
return integers
}
func doStuffForOne() {
//does stuff unrelated to the other classes
}
}
class Two : FirstThree {
fileprivate var integers: [Int] {
return [1, 2, 3, 201]
}
override func allIntegers() -> [Int] {
return integers
}
func doStuffForTwo() {
//does stuff unrelated to the other classes
}
}
class Three : Numbers {
fileprivate var integers: [Int] {
return [301, 302, 303]
}
override func allIntegers() -> [Int] {
return integers
}
func doStuffForThree() {
//does stuff unrelated to the other classes
}
}
class FirstThree : Numbers {
fileprivate var integers: [Int] {
return [1, 2, 3]
}
override func allIntegers() -> [Int] {
return integers
}
func doStuffForFirstThree() {
//does stuff unrelated to the other classes
}
}
class Numbers {
func allIntegers() -> [Int] {
fatalError("subclass this")
}
func printMe() {
allIntegers().forEach({ print($0) })
}
}
Numbers
有很多方法printMe()
,我希望我的所有子类的任何实例都能够调用。
Numbers
还有一个allIntegers()
函数,我希望这些子类的任何实例都能够调用。作为变量,哪个可能更好?但是我不能覆盖子类中的变量。因此,我在每个子类中使用相同的私有变量integers
,由allIntegers()
.
还要注意它自己的实例Numbers
永远不应该调用allIntegers()
,它应该只在子类上调用。
最后,请注意一些子类包含相同的对象1, 2, 3
,然后每个子类都有一些自定义整数。但不是所有的子类。如果我后来决定所有这些子类都需要一个4
整数,我必须手动遍历每个类并将 a4
打入数组,这显然容易出错。
我已经阅读了面向协议的编程,并且觉得可能有一个解决方案,或者我会很感激任何其他建议和创造性的方法来构建一个更好的项目。
谢谢!
编辑
所有子类都是不同的,因为它们也有自己的功能要执行。我已经更新了代码以反映这一点。
想象一下,一个给定的类 likeOne
在整个代码库中被初始化了很多次,并且总是用完全相同的integers
. 放:
let one = One(integers: [1, 2, 3, 101, 102])
整个代码库都容易出错。
希望这可以解决我提出的人为示例的一些问题。
解决方案
感谢大家的帮助。这是我想出的解决方案(请假设所有类都有自己独特的方法)。
class One : FirstThree {
override init() {
super.init()
self.integers = super.integers + [101, 102]
}
}
class Two : FirstThree {
override init() {
super.init()
self.integers = super.integers + [201]
}
}
class Three : Numbers {
var integers = [301, 302, 303]
}
class FirstThree : Numbers {
let integers = [1, 2, 3]
}
protocol Numbers {
var integers: [Int] { get }
func printMe()
}
extension Numbers {
func printMe() {
integers.forEach({ print($0) })
}
}