Latest web development tutorials

La herencia Swift

La herencia puede ser entendida como una clase obtenemos los métodos y propiedades de otra clase.

Cuando una clase hereda de otra clase, la clase derivada se llama una subclase, la clase hereditaria llamada superclase (o el padre)

En Swift, las clases pueden llamar y acceder a los métodos, las propiedades y la escritura subíndice de la superclase, y pueden anularla.

También podemos añadir una propiedad heredada propiedades observador de la clase.


clase base

No hay otras clases heredan de una clase, llamar a la clase base (base de la Clase).

En el ejemplo siguiente, se define una clase base StudDetails, describe el estudiante (stname) y todas las puntuaciones de los sujetos (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)

La salida por encima de la ejecución del programa es:

swift
98
89
76
swift
98
89
76

subclase

Se refiere a una subclase es crear una nueva clase basada en una clase existente.

Para especificar la superclase de una clase, el nombre de la clase súper escrito en la parte posterior del nombre de subclase, (:) sintaxis separados por dos puntos es el siguiente

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

Ejemplos

En el ejemplo siguiente, se define un StudDetails superclase, a continuación, Tom subclase heredará,

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()

La salida por encima de la ejecución del programa es:

Mark1:93, Mark2:89

Reescritura (Anulación)

Subclase puede heredar métodos de instancia, métodos de clase, ejemplo, propiedad o escritura subíndice de realizar sus funciones de personalización, llamamos a este comportamiento reescrito (primordial).

Podemos utilizar la palabra clave override para lograr reescritura.

Los métodos de acceso superclase, las propiedades y la escritura subíndice

El método se puede utilizar para acceder al prefijo súper super clase, la propiedad o la escritura subíndice.

volver a escribir Los métodos de acceso, propiedades, escritura subíndice
camino super.somemethod ()
propiedad super.someProperty ()
guión subíndice súper [someIndex]

de métodos y propiedades

Sustitución de métodos

En nuestro sub-clase, podemos utilizar la palabra clave override para anular el método de la superclase.

Los siguientes ejemplos, que reescribir el método 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()

La salida por encima de la ejecución del programa es:

这是超类 SuperClass
这是子类 SubClass

Propiedades imperiosas

Puede proporcionar un captador de encargo (o colocador) para volver a escribir cualquier propiedad heredada, si la propiedad se hereda de un tipo de almacenamiento o escribe el cómputo de la propiedad.

Subclase no conoce la propiedad heredada es el tipo de almacenamiento o el tipo de cálculo, que sólo conoce la propiedad heredada tendrá un nombre y tipo. Así que vuelve a escribir una propiedad, es necesario que el nombre y el tipo de escrito.

precauciones:

  • Si proporciona colocador en la reescritura de propiedades, a continuación, usted debe proporcionar captador.

  • Si no desea captador versión reescrita en la modificación de valores de las propiedades heredadas, puede volver a los valores heredados por super.someProperty, donde someProperty es el nombre que desea sustituir la propiedad.

En el siguiente ejemplo se define una subclase de la superclase del círculo y el rectángulo, que reescribir el área de propiedad de clase Rectángulo:

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)")

La salida por encima de la ejecución del programa es:

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

Redefinición de las propiedades Visor

Puede añadir un alojamiento a la herencia de las propiedades observadas en la reescritura. Como resultado, cuando cambia el valor de la propiedad heredada, que serán objeto de seguimiento.

Nota: No sepuede agregar propiedades de observador para el tipo de atributo heredado de memoria constantes o propiedad heredada de sólo lectura computacional.

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

Prevenir la reescritura

Podemos utilizar la palabra clave final les impide ser sobrescrito.

Si reemplaza un método final, la propiedad o la escritura de un subíndice, en el error de tiempo de compilación.

Puede añadir el final antes de la clase de palabras clave característica (clase final) a toda la clase está marcado final, por lo que la clase no se puede heredar, de lo contrario serán reportados errores de compilación.

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)")

Debido al ejemplo anterior utiliza la palabra clave final no se le permite volver a escribir, por lo que se le dará ejecución:

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 {
      ^