Переопределить свойство в подклассе Swift - PullRequest
1 голос
/ 02 июня 2019

Может кто-нибудь объяснить поведение при наследовании свойств?Я уверен, что есть хорошее объяснение того, почему переопределение фактически не переопределяет свойство.

Почему Swift допускает переопределение свойства surname, но, по-видимому, все еще использует свойство суперкласса и связанные функции?Они не переопределяются.

Может показаться, что мне нужно определить некоторую функцию, которая вызывается в методе didSet(), и переопределить ее, чтобы подкласс не наследовал функцию суперкласса, как в telephone property.

Есть ли способ переопределить метод didSet() свойства?Создание вызываемой функции, кажется, добавляет ненужную дополнительную сложность?

Как правильно достичь этого?

import Cocoa

class BaseClass {
    var _name: String?
    var name: String? {
        get {
            return _name
        }
        set {
            _name = newValue
            print("BaseClass \(name)")
        }
    }

    var surname: String? {
        didSet {
            print("BaseClass \(surname)")
        }
    }

    var telephone: String? {
        didSet {
            telephoneSet()
        }
    }

    func telephoneSet(){
        print("BaseClass \(telephone)")
    }
}

class SubClass: BaseClass {
    override var name: String? {
        get {
            return _name
        }
        set {
            _name = newValue
            print("SubClass \(name)")
        }
    }
    override var surname: String? {
        didSet {
            print("SubClass \(surname)")
        }
    }

    override func telephoneSet(){
        print("SubClass \(telephone)")
    }
}


let object = SubClass()

object.name = "Jenny"
object.surname = "Jones"
object.telephone = "10810"

Создает следующий вывод:

SubClass Optional("Jenny")
BaseClass Optional("Jones")
SubClass Optional("Jones")
SubClass Optional("10810")

1 Ответ

1 голос
/ 02 июня 2019

Давайте уменьшим пример:

class BaseClass {
    var surname: String? {
        didSet { print("BaseClass \(surname)") }
    }
}

class SubClass: BaseClass {
    override var surname: String? {
        didSet { print("SubClass \(surname)") }
    }
}

Тогда:

let object = SubClass()
object.surname = "Jones"

Будет производить:

BaseClass Необязательно ("Джонс")
Дополнительный подкласс («Jones»)

Вышеуказанное не переопределяет сохраненное свойство, surname, другим сохраненным свойством. Существует только сохраненное свойство базового класса, и подкласс просто добавляет своего собственного наблюдателя к этому свойству. Я отсылаю вас к Язык программирования Swift: Наследование: Переопределение , который гласит:

Переопределение наблюдателей за недвижимостью

Вы можете использовать переопределение свойств для добавления наблюдателей свойств в унаследованное свойство. Это позволяет получать уведомления при изменении значения унаследованного свойства независимо от того, как это свойство было изначально реализовано.

В вашем примере name вы переопределяете вычисляемое свойство собственным вычисляемым свойством подклассов. Аналогично, в вашем примере telephoneSet вы также переопределяете метод собственным методом подклассов. Но с surname вы не переопределяете свойство базовых классов, а просто позволяете подклассу добавить наблюдателя в хранимое свойство базовых классов.

...