В чем разница между окончательным классом и классом?
final class A {
}
class B {
}
В чем разница между окончательным классом и классом?
final class A {
}
class B {
}
Final - это модификатор класса, который предотвращает его унаследованность или переопределение. Из документации Apple
Вы можете запретить переопределение метода, свойства или индекса отметив его как final. Сделайте это, написав окончательный модификатор перед ключевыми словами интрокера метода, свойства или индексов как final var, final func, final class func и окончательный индекс).
Любая попытка переопределить конечный метод, свойство или индекс в подкласс сообщается как ошибка времени компиляции. Методы, свойства или индексы, добавляемые к классу в расширении, также могут быть отмечены как окончательный в определении расширений.
Вы можете отметить весь класс как final, написав окончательный модификатор перед ключевым словом класса в определении класса (окончательный класс). Любые попытка подкласса последнего класса сообщается как ошибка времени компиляции.
Классы с final
не могут быть переопределены.
Почему вообще нужно заботиться о том, может ли класс переопределяться или не может быть переопределен?
Можно рассмотреть две вещи:
final
предотвращает выполнение класса подкласса-миссии. Вы также можете использовать final
для обозначения методов, свойств и даже индексов не конечных классов. Это будет иметь такой же эффект, но для определенной части класса.final
также сообщает компилятору Swift, что метод следует вызывать непосредственно (статическая отправка), а не искать функцию из таблицы методов (динамическая отправка). Это уменьшает накладные расходы функций и дает вам дополнительную производительность. Вы можете прочитать об этом в блоге Swift Developer.Используйте final, когда вы знаете, что декларация не требуется переопределены. Последнее ключевое слово - это ограничение на класс, метод или свойство, указывающее, что объявление не может быть переопределено. Это позволяет компилятору безопасно преодолевать динамическую диспетчеризацию.
Подробнее:
Final означает, что никто не может наследовать этот класс.
Кроме того, объявление final
не нуждается в переопределении, также имеет лучшую производительность, чем без использования final
, потому что final
отключает динамическую отправку во время выполнения, что позволяет сократить время выполнения.
Другие ответы уже дают достаточно понимания о конечном ключевом слове. Я хочу объяснить на некотором примере.
Давайте рассмотрим приведенный ниже пример без 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