Latest web development tutorials

Swift Наследование

Наследование может быть понято как класс мы получаем методы и свойства другого класса.

Когда класс наследует от другого класса, называется подкласс наследования классов, унаследованный класс называется суперкласс (или родитель)

В Swift, классы могут позвонить и получить доступ к методам, свойствам и индекс скрипт суперкласса, и может переопределить их.

Мы можем также добавить свойства наблюдателя наследственного имущества для класса.


Базовый класс

Никакие другие классы не наследуют класс, вызовите базовый класс (базовый класс).

В следующем примере мы определяем базовый класс StudDetails, описывает студента (stname) и всех субъектов оценки (mark1, Mark2, Mark3):

class StudDetails {
    var stname: String!
    var mark1: Int!
    var mark2: Int!
    var mark3: Int!
    init(stname: String, mark1: Int, mark2: Int, mark3: Int) {
        self.stname = stname
        self.mark1 = mark1
        self.mark2 = mark2
        self.mark3 = mark3
    }
}
let stname = "swift"
let mark1 = 98
let mark2 = 89
let mark3 = 76

print(stname)
print(mark1)
print(mark2)
print(mark3)

Выход выше выполнение программы:

swift
98
89
76
swift
98
89
76

Подкласс

Относится к подклассу, чтобы создать новый класс на основе существующего класса.

Чтобы указать суперкласс класса, название супер класс написано на обратной стороне имя подкласса, (:) разделённых двоеточиями синтаксис выглядит следующим образом

class SomeClass: SomeSuperclass {
    // 类的定义
}

примеров

В следующем примере мы определим суперкласса StudDetails, то подкласс Том наследует его:

class StudDetails
{
    var mark1: Int;
    var mark2: Int;
    
    init(stm1:Int, results stm2:Int)
    {
        mark1 = stm1;
        mark2 = stm2;
    }
    
    func show()
    {
        print("Mark1:\(self.mark1), Mark2:\(self.mark2)")
    }
}

class Tom : StudDetails
{
    init()
    {
        super.init(stm1: 93, results: 89)
    }
}

let tom = Tom()
tom.show()

Выход выше выполнение программы:

Mark1:93, Mark2:89

Rewrite (Перекрытие)

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

Мы можем использовать ключевое слово переопределения для достижения переписывают.

Доступ к суперкласса методы, свойства и нижний индекс сценария

Метод можно использовать для доступа к приставкой супер супер класс, свойство или подстрочный скрипт.

перезапись Методы доступа, свойства, нижний индекс сценария
способ super.somemethod ()
свойство super.someProperty ()
Подстрочный сценарий супер [someIndex]

Переопределение методов и свойств

Переопределение методов

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

Ниже приведены примеры, мы перепишем метод Show ():

class SuperClass {
    func show() {
        print("这是超类 SuperClass")
    }
}

class SubClass: SuperClass  {
    override func show() {
        print("这是子类 SubClass")
    }
}

let superClass = SuperClass()
superClass.show()

let subClass = SubClass()
subClass.show()

Выход выше выполнение программы:

这是超类 SuperClass
这是子类 SubClass

Переопределение свойств

Вы можете предоставить собственный метод получения (или сеттера), чтобы переписать любую наследственное имущество, является ли свойство, унаследованное типу хранения или вычислительное типа собственности.

Подкласс не знает, унаследованное свойство является тип хранения или тип расчета, она знает только унаследованное свойство будет иметь имя и тип. Таким образом, вы переписать свойство, необходимо имя и тип записанным.

Меры предосторожности:

  • Если вы предоставляете сеттер в перезаписи свойств, то вы должны предоставить добытчика.

  • Если вы не хотите геттерного переписан версию в модификации унаследованных значений свойств, вы можете вернуться к значениям, унаследованных super.someProperty, где SomeProperty имя, которое вы хотите переопределить свойство.

В следующем примере мы определяем подкласс суперкласса Circle и Rectangle, перепишем область класса свойство Прямоугольник:

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径 \(radius) "
    }
}

// 继承超类 Circle
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

Выход выше выполнение программы:

Radius 矩形半径 25.0  ,但现在被重写为 3

Перекрытие свойства просмотра

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

Примечание: Вы не можете добавить свойства для наблюдателя унаследованного типа атрибутов константы памяти или только для чтения вычислительной наследственного имущества.

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}

class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}


let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

class Square: Rectangle {
    override var radius: Double {
        didSet {
            print = Int(radius/5.0)+1
        }
    }
}


let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")
半径: 矩形半径为 25.0  ,但现在被重写为 3
半径: 矩形半径为 100.0  ,但现在被重写为 21

Предотвращение перезаписи

Мы можем использовать окончательное ключевое слово предотвращает их от перезаписи.

Если переопределить окончательный метод, свойство или подстрочный сценарий, при компиляции ошибки времени.

Вы можете добавить заключительный перед классом ключевого слова характеристика (конечный класс) ко всему классу отмечен окончательным, так что класс не может быть унаследован, в противном случае ошибки компиляции будет сообщено.

final class Circle {
    final var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

class Square: Rectangle {
    override var radius: Double {
        didSet {
            print = Int(radius/5.0)+1
        }
    }
}

let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")

Благодаря упомянутой выше примере используется окончательное ключевое слово не допускается переписать, так что выполнение будет дано:

error: var overrides a 'final' var
    override var area: String {
                 ^
note: overridden declaration is here
    var area: String {
        ^
error: var overrides a 'final' var
    override var radius: Double {
                 ^
note: overridden declaration is here
    final var radius = 12.5
              ^
error: inheritance from a final class 'Circle'
class Rectangle: Circle {
      ^