Ответ
Нет. Статические (static) методы и свойства принадлежат самому типу, а не его экземплярам, и не поддерживают полиморфизм, поэтому их нельзя переопределить в подклассе.
Для создания методов класса, поддерживающих переопределение, используйте ключевое слово class.
Пример:
class Parent {
class func someMethod() {
print("Parent method")
}
}
class Child: Parent {
override class func someMethod() {
print("Child method")
}
}
Почему? Модификатор static является псевдонимом для class final — он делает метод финальным, что исключает возможность переопределения в иерархии наследования.
Ответ 18+ 🔞
А, ну это же классика, блядь! Сидишь такой, пишешь код, всё пучком, а потом — бац! — и на тебе: «Нет, сука, нельзя!». Как будто в дверь постучали и сказали: «Ты тут, дружок, не на той ветке сидишь, иди нахуй».
Так вот, слушай сюда, разберём эту дичь. static — это как твой старый, блядь, диван, который намертво прикручен к полу в гостиной. Он принадлежит дому (типу), а не тебе лично (экземпляру). И как ты его ни крути, переставить в спальню или нахуй выкинуть — нихуя. Он там навечно. Поэтому когда ты в наследнике (Child) пытаешься его «переопределить» — это как пытаться на старый диван натянуть новый чехол и назвать его кроватью. Не, чувак, не прокатит. Компилятор тебе так и скажет: «Иди нахуй, это final, блядь».
А если тебе реально надо, чтобы метод был у класса, но чтобы его ещё и переписать можно было — вот тебе волшебное слово: class. Это как диван на колёсиках, блядь. Вроде тоже в гостиной стоит (принадлежит типу), но его можно покатить в другую комнату и немного переделать под себя.
Смотри, как это выглядит без всякой, блядь, пиздобратии:
class Parent {
// Это можно переопределить, потому что class
class func flexibleMethod() {
print("Родительский метод, не статичный, живой ещё")
}
// А это НЕЛЬЗЯ, потому что static (а на деле class final)
static func rigidMethod() {
print("Родительский метод, прибитый гвоздями")
}
}
class Child: Parent {
// Так — можно, ебать оно всё конём!
override class func flexibleMethod() {
print("Дочерний метод, всё переиграли")
}
// А так — НИЗЯ! Попробуй — получишь пизды от компилятора.
// override static func rigidMethod() { } // ОШИБКА: Cannot override static method
}
Короче, запомни, как «Отче наш»:
- Хочешь прибить метод намертво к типу, чтобы никто, даже наследники, не мог его тронуть —
static. - Хочешь, чтобы метод был у типа, но оставить люфт для манёвра потомкам —
class.
Всё просто, как три, блядь, копейки. Не усложняй, а то опять на оверрайд статики попрёшься и будешь тут охуевать.