Я хочу обратить внимание на другое решение, предоставленное Required
, кроме приведенного выше Мэтта.
class superClass{
var name: String
required init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
}
let instanceSubClass = subClass()
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Subclass Untitled"
Как вы можете проверить в приведенном выше примере, я объявил required init()
на superClass
, init()
инициализатор суперкласса унаследовал по умолчанию subClass
, Таким образом, вы в состоянии создать экземпляр Подкласс let instanceSubClass = subClass()
.
Но предположим, что вы хотите добавить один назначенный инициализатор на subClass, чтобы присвоить значение времени выполнения хранящемуся свойству neakName
. Конечно, вы можете добавить его, но это приведет к . Никакие инициализаторы из суперкласса не будут унаследованы в subClass. Поэтому, если вы создадите экземпляр subClass
, вы создадите его через свой назначенный инициализатор, как показано ниже.
class superClass{
var name: String
init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
init(neakName: String) {
self.neakName = neakName
}
}
let instanceSubClass = subClass(neakName: "Bobby")
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Bobby"
Здесь выше, вы не сможете создать экземпляр subClass
, просто subClass()
, Но если вы хотите, чтобы каждые подклассы суперкласса должны иметь свой собственный init()
инициализатору создать прямой экземпляр с subClass()
. Просто разместите ключевое слово required
до init()
на суперклассе, это заставит вас добавить init()
инициализатор на subClass
тоже - как показано ниже.
class superClass{
var name: String
required init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
init(neakName: String) {
self.neakName = neakName
}
} // Compiler error <------------ required `init()` must be provided by subClass.
let instanceSubClass = subClass(neakName: "Bobby")
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Bobby"
SO, используйте required
ключевое слово, прежде чем инициализаторе на суперкласс, когда вы хотите, чтобы все подклассы должны были реализованы required initializer
из суперкласса.
Реализация в ваших подклассах не требуется из-за наследования, что имеет смысл. Однако я также интересуюсь этой выгодой. Если подкласс (который гипотетически переопределяет 'init()', но не какой-либо требуемый инициализатор) получает init процессом, который вызвал унаследованный требуемый инициализатор, и что требуемый инициализатор впоследствии вызывает 'init()', не вызовет ли он подкласс ' переопределенный init и все хорошо? - Я думаю, что единственной хорошей причиной было бы то, что требуемый инициализатор ** не ** вызывает 'init()' на себе, поэтому переопределение «init()» никогда не будет вызвано. –
Это может быть интересно в этом контексте: [Протокол func возвращает Self] (http://stackoverflow.com/questions/25645090/protocol-func-returning -self). –