Наследование в быстрых протоколах

Как решить в swift (2.0) этот случай: у нас есть два протокола:

protocol SuperDelegate{
     func handleSuccess(rsp: BaseRsp)
}

protocol ChildOfSuperDelegate: SuperDelegate {
    func handleSuccess(rsp: ChildOfBaseRsp)
}

и какое-то место в коде, где мы хотим сделать:

class A{
    var delegate:SuperDelegate?

    func foo(){
        delegate?.handleSuccess(childOfBaseRspObj)
    }
}

class Xyz:ChildOfSuperDelegate{
     func handleSuccess(rsp: ChildOfBaseRsp){
        print("Great!")
     } 
}

но компилятор не находит наследования в протоколах (handleSuccess имеет функцию с базовыми и дочерними параметрами) возникает ошибка компиляции:

Type 'Xyz' does not conform to protocol 'SuperDelegate'

. Как их решить? Как лучше всего реализовать только методы ChildOfSuperDelegate, но класс «A» использует переменную SuperDelegate.

Может быть, я должен использовать общие типы, чтобы иметь что-то вроде наследования в протоколах.


person luky0007    schedule 06.02.2017    source источник
comment
Тип параметра отличается для параметров протоколов.   -  person Luca D'Alberti    schedule 06.02.2017
comment
Ну, ваш delegate говорит, что у него есть метод handleSuccess, который принимает BaseRsp, но Xyz говорит, что он может принимать только ChildOfBaseRsp. Это никак не может работать безопасно. Xyz просто не удовлетворяет требованиям func handleSuccess(rsp: BaseRsp).   -  person Hamish    schedule 06.02.2017
comment
Я знаю. Но как их разрешить, у меня должен быть superDelegate и что-то вроде наследования в протоколах. Является ли универсальные типы хорошей идеей?   -  person luky0007    schedule 06.02.2017
comment
сделать тип одинаковым.   -  person Rocky Balboa    schedule 06.02.2017
comment
Я сомневаюсь, что вы используете хороший подход. Я думаю, что в таких случаях лучше использовать расширения протоколов, чтобы избежать наследования и получить поведение, подобное абстрактному классу. Здесь упоминается: stackoverflow.com/questions/24110396/< /а>   -  person marcinax    schedule 06.02.2017


Ответы (1)


Здесь ваш протокол ChildOfSuperDelegate унаследован от SuperDelegate, и хотя это протокол, он не реализует свои методы. Но когда вы наследуете от ChildOfSuperDelegate, вы также должны реализовать метод SuperDelegate и ChildOfSuperDelegate.

Итак, сделайте так:

class Xyz:ChildOfSuperDelegate{
  func handleSuccess(rsp: BaseRsp) {
    //do stuff 
  }

func handleSuccess(rsp: ChildOfBaseRsp){
     print("Great!")
  }
}
person Rocky Balboa    schedule 06.02.2017
comment
Я знаю это. Это не я ищу. Я хочу вызвать функцию протокола с полиформизмом, например: delegate.handleSuccess(rspChildOfBaseRspObj) or delegate.handleSuccess(anotherChild), но мой делегат - это объект, реализующий SuperDelegate (только). Итак, вопрос в том, почему протоколы не имеют полиморфных методов и что такое обходные пути. - person luky0007; 08.02.2017