В чем разница между окончательным классом и классом?

В чем разница между окончательным классом и классом?

final class A {

}

class B {    

}

Ответ 1

Final - это модификатор класса, который предотвращает его унаследованность или переопределение. Из документации Apple

Вы можете запретить переопределение метода, свойства или индекса отметив его как final. Сделайте это, написав окончательный модификатор перед ключевыми словами интрокера метода, свойства или индексов как final var, final func, final class func и окончательный индекс).

Любая попытка переопределить конечный метод, свойство или индекс в подкласс сообщается как ошибка времени компиляции. Методы, свойства или индексы, добавляемые к классу в расширении, также могут быть отмечены как окончательный в определении расширений.

Вы можете отметить весь класс как final, написав окончательный модификатор перед ключевым словом класса в определении класса (окончательный класс). Любые попытка подкласса последнего класса сообщается как ошибка времени компиляции.

Ответ 2

Классы с final не могут быть переопределены.


Почему вообще нужно заботиться о том, может ли класс переопределяться или не может быть переопределен?

Можно рассмотреть две вещи:

  • Как разработчик/разработчик API, у вас может быть класс в вашей Framework, который можно злоупотреблять или использовать неправильно при подклассе. final предотвращает выполнение класса подкласса-миссии. Вы также можете использовать final для обозначения методов, свойств и даже индексов не конечных классов. Это будет иметь такой же эффект, но для определенной части класса.
  • Класс маркировки как final также сообщает компилятору Swift, что метод следует вызывать непосредственно (статическая отправка), а не искать функцию из таблицы методов (динамическая отправка). Это уменьшает накладные расходы функций и дает вам дополнительную производительность. Вы можете прочитать об этом в блоге Swift Developer.

Ответ 3

Используйте final, когда вы знаете, что декларация не требуется переопределены. Последнее ключевое слово - это ограничение на класс, метод или свойство, указывающее, что объявление не может быть переопределено. Это позволяет компилятору безопасно преодолевать динамическую диспетчеризацию.

Подробнее:

https://developer.apple.com/swift/blog/?id=27

Ответ 4

Final означает, что никто не может наследовать этот класс.

Ответ 5

Кроме того, объявление final не нуждается в переопределении, также имеет лучшую производительность, чем без использования final, потому что final отключает динамическую отправку во время выполнения, что позволяет сократить время выполнения.

Ответ 6

Другие ответы уже дают достаточно понимания о конечном ключевом слове. Я хочу объяснить на некотором примере.

Давайте рассмотрим приведенный ниже пример без final ключевого слова.

class A {
   public var name: String
   var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}
class B:A{
    override init(name: String, breed: String) {
        super.init(name: name, breed: breed)
    }
}

В приведенном выше коде это позволяет перезаписать переменную этого суперкласса. Класс с последним ключевым словом не позволяет. Смотрите ниже пример.

final class A {
   public var name: String
   var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}

class B:A{
    **//ERROR:inheritance from a final class 'A' class B**
    override init(name: String, breed: String) {
        super.init(name: name, breed: breed)
    }
}

Приведенный выше код даст наследование ошибок от конечного класса A класса B