我一直在努力理解协议式编程,但是我不明白以下两种情况的区别...
情况1
我有两个类都是UIViewControllers
。这两个类都需要使用某些共同的功能,因此我创建了一个协议和一个扩展,其中包含协议的默认实现,然后视图控制器只需要在类行中拥有该协议,就可以自动继承所需的功能,即...
protocol SomeProtocol {
func foo()
}
extension SomeProtocol {
func foo(){
//execute
}
}
class FirstViewController: UIViewController, SomeProtocol {
...
func doSomething(){
foo()
}
}
class SecondViewController: UIViewController, SomeProtocol {
...
func doSomethingElse(){
foo()
}
}
场景2
我有两个类是UIViewControllers
。这两个类都需要使用一些共同的功能,因此我创建了一个控制器类,两个UIViewController
类都使用控制器类的实例。即...
class FirstViewController: UIViewController {
...
let controller = Controller()
func doSomething(){
controller.foo()
}
}
class SecondViewController: UIViewController {
...
let controller = Controller()
func doSomethingElse(){
controller.foo()
}
}
class Controller {
func foo(){
//execute...
}
}`
那么两者有什么不同?在任何需要使用foo()
函数的地方,我都可以只取得一个Controller()
实例。通过将foo()
函数放入协议中,并使需要foo()
函数的类从该协议继承,我能获得什么优势呢?