【发布时间】:2021-04-02 13:19:05
【问题描述】:
我是 swift 协议的新手,并尝试通过考虑 Solid 原则来使用它。我采用了两个协议(A,B)并将它们与第三个协议(D)结合起来。想法是根据需要在另一个类的两个协议之间进行选择。查看代码以了解更多信息。
protocol A {
func fetchA()
}
protocol B {
func fetchB()
}
protocol D : A,B { }
extension D {
func fetchB() { }
func fetchA() {}
}
class B1 : D {
func fetchB() {
print("B")
}
}
class A1 : D {
func fetchA() {
print("A")
}
}
protocol C {
func fetchC()
}
class C1 : C {
func fetchC() {
print("C")
}
}
enum Ab {
case a
case b
}
struct Hello {
let first : D
let second : C
init(first : D , second :C) {
self.first = first
self.second = second
}
func show(type:Ab){
switch type {
case .a:
first.fetchA()
case .b:
first.fetchB()
}
second.fetchC()
}
}
let obj = Hello.init(first: A1(), second: C1())
obj.show(type:.a)
所以当前代码打印“A”。现在,如果我可以将 first 参数更改为 B1() 和 type .b 并打印“B”。我想改进代码库并删除enum 类型,并希望在协议的帮助下获得相同的结果。需要在此处进行哪些更改。?提前致谢。
具体目标:我有 NetworkManger(Class A1)、FirebaseManger(Class B1) 和 LocalDatabaseManger(Class C1)。我想使用 NetworkManger 或 FirebaseManger 进行网络调用,如果失败则调用 LocalDatabaseManger。
【问题讨论】:
-
首先为什么
A1甚至符合B(由于符合D)?感觉不应该。 -
你能用更具体的术语解释你想要完成什么吗?看起来您正试图将多个对象包装成一个对象,并且有点模仿多重继承,但为什么呢?
-
SOLID 是 OOP 的一组原则。 Swift 协议不是面向对象的工具。它们是不基于继承的不同组合方法。虽然 SOLID 的某些概念对协议有意义,但我相信您在这里尝试做的是使用协议重新发明类继承,这是 Swift 的反目标。它更倾向于组合而不是继承和静态而不是动态调度。
-
要开发好的协议,从具体的实现开始,然后使用协议提取可以在其上构建算法的共享行为。从复杂的协议层次结构开始几乎总是会遇到麻烦。
-
@Caleb 我已经更新了问题。
标签: swift protocols swift-protocols