2016-04-28 2 views
2

Я читаю книгу Swift Programming Language .SWIFT: разница между init и super.init

В книге говорится, что Init является инициализатором для установки класса при создании экземпляра. (Я понимаю: создав экземпляр, будет выполняться блок кода в init()).

Однако книга показывает super.init, но ничего не говорит об этом.

ответ

2

Официальная документация действительно покрывает аспект инициализации суперкласса:

Init() инициализатор для велосипедов начинается с вызова super.init(), который вызывает инициализатор по умолчанию для суперкласса класса велосипеда, автомобиля , Это гарантирует, что свойство унаследованного numberOfWheels инициализируется транспортным средством до того, как у велосипеда будет возможность изменить свойство. После вызова super.init(), первоначальное значение numberOfWheels заменяется новым значением 2.

Соответствующий пример кода:

суперкласса:

class Vehicle { 
    var numberOfWheels = 0 
    var description: String { 
     return "\(numberOfWheels) wheel(s)" 
    } 
} 

Подкласс:

class Bicycle: Vehicle { 
    override init() { 
     super.init() 
     numberOfWheels = 2 
    } 
} 

Source

+0

Спасибо Я теперь понимаю: D. То, что я нахожу странным, - это то, почему вам нужно изменить число колес на велосипеде, если вы не используете его в подклассе. Я мог бы просто создать другое свойство на велосипеде, или это значит, что когда вы его инициализируете, вы используете одну и ту же память? – LifeOS

+1

В этом весь смысл наследования. У каждого автомобиля есть колеса, поэтому суперкласс может иметь свойство 'numberOfWheels'. Если, например, вы создали бы «Трицикл: автомобиль», вы могли бы установить «numberOfWheels» на 3. – James

+0

Спасибо Джеймс, очень хорошее объяснение! – LifeOS

3

Допустим, у вас есть объект

class myObject : NSObject { 

    var a : Int 
    var b : Int 

    init() { 
     a = 1 
     b = 2 
     super.init() 
    } 
} 

Поскольку myObject унаследован от NSObject он должен вызвать super.init() для инициализации всех свойств объекта он наследует. в то время как ваш init инициализирует все свойства, специфичные для вашего настраиваемого объекта.

2

super только ссылки на суперкласс и суперкласс имеет init метод, поэтому по телефону super.init() вы звоните init метод суперкласса без параметров. Если init метод суперкласса имеют параметры

class Animal { 
    init(name: String) { 

    } 
} 

вы должны передать параметры этого метода

class Cat: Animal { 
    init() { 
     super.init(name: "Cat") 
    } 
} 

class PersianCat: Cat { 
    override init() { 
     super.init() 
    } 
} 
+0

В подклассе Cat вы говорите: Super.init (имя: "cat"). Что может случиться с аргументом, который вы передали? Что мы можем сделать с «кошкой». Может ли это вернуться к суперклассу? – LifeOS

+1

Это всего лишь метод. Поэтому мы не знаем и не должны заботиться о том, что произойдет с «кошкой». Но мы должны передать некоторую ценность, чтобы иметь возможность выводить из «Животного». Суперкласс может иметь некоторые зависимости, которые мы удовлетворяем, передавая параметры 'init'. Тогда суперкласс использует их, но мы можем не знать, как это сделать. –

Смежные вопросы