Я пытался понять протокольно-ориентированное программирование, но не понимаю разницы между двумя следующими сценариями...
Сценарий 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()
, от протокола?