Я немного напутал со следующей концепцией:

Код 1:

class New{
    func abc(){
        print("new class")
    }
}

class ClassNew: New {
    override func abc() {
        print("derived class")
    }
}

Код 2:

protocol New{}

extension New{
    func abc(){
        print("new protocol")
    }
}

class ClassNew: New {
    func abc() {
        print("derived protocol")
    }
}
  1. В чем разница между Code 1 и Code 2, поскольку оба они служат одной и той же цели?

  2. В code 2 classNew есть inheriting из нового протокола или просто conforming в протокол?

Любое объяснение будет высоко оценено!

9
Shubham Mishra 4 Сен 2017 в 14:24

3 ответа

classNew просто соответствует протоколу во втором коде. Это верно для каждого протокола в Swift, поскольку наследование в настоящее время не поддерживается с протоколами.

Это также отвечает на ваш первый вопрос: нет существенной разницы между двумя кодами в этом сценарии использования, но, вообще говоря, протокол хорош для других вещей, чем использование подклассов.

1
Tamás Sengel 4 Сен 2017 в 11:30

Код 2 является примером расширения протокола . Большая разница в том, что вы не можете вызвать super.abc() в Code 2 - вы должны предоставить реализацию метода, которая не находится ни в каком super контексте.

Просто мое мнение - не используйте реализацию протокола по умолчанию, так как компилятор не спасет вас, если вы забудете предоставить «переопределение», когда оно вам действительно нужно.

1
Alexey Kozhevnikov 4 Сен 2017 в 19:07

Code 1 и Code 2 абсолютно одинаковы, просто концептуально различны.

Если мы выражаем это простыми словами, то Class определяет сам объект, а Protocol определяет поведение объекта.

По сравнению с Java protocol похож на Interfaces.

Оформить протокол Документация

1
skynet 4 Сен 2017 в 11:45