В чем разница между окончательным классом и классом?
В чем разница между окончательным классом и классом?
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