Latest web development tutorials

Herança Swift

A herança pode ser entendido como uma classe que obter os métodos e propriedades de outra classe.

Quando uma classe herda de outra classe, a classe derivada é chamado de uma subclasse, a classe hereditária chamada superclasse (ou pai)

Na Swift, as classes podem acesso e chamar os métodos, propriedades e roteiro subscrito da superclasse, e pode substituí-los.

Nós também pode adicionar propriedades observador propriedade herdada para a classe.


classe base

Não há outras classes herdar uma classe, chamar a classe base (Base Class).

O exemplo a seguir, definimos um StudDetails classe base, descreve o estudante (stname) e todos os sujeitos pontos (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)

A saída de execução de programa acima é:

swift
98
89
76
swift
98
89
76

subclasse

Refere-se a uma subclasse é criar uma nova classe com base em uma classe existente.

Para especificar a superclasse de uma classe, o nome de classe Super escrito na parte de trás do nome da subclasse, (:), separados por vírgulas sintaxe é como se segue

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

Exemplos

O exemplo a seguir, definimos um StudDetails superclasse, então subclasse Tom herdá-la:

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

A saída de execução de programa acima é:

Mark1:93, Mark2:89

Rewrite (Overriding)

Subclasse pode ser herdada métodos de instância, métodos de classe, instância, a propriedade ou roteiro subscrito para realizar as suas capacidades de personalização, chamamos este comportamento reescrito (primordial).

Podemos usar a palavra-chave override para alcançar reescrita.

métodos de acesso da superclasse, propriedades e roteiro subscrito

O método que você pode usar para acessar o prefixo super super classe, propriedade ou roteiro subscrito.

reescrever métodos de acesso, propriedades, roteiro subscrito
caminho super.somemethod ()
propriedade super.someProperty ()
roteiro subscrito Super [someIndex]

Substituindo métodos e propriedades

Substituindo métodos

Em nossa sub-classe, podemos usar a palavra-chave override para substituir o método da superclasse.

Os exemplos a seguir, reescrevemos o 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()

A saída de execução de programa acima é:

这是超类 SuperClass
这是子类 SubClass

Propriedades imperativas

Você pode fornecer um getter personalizada (ou setter) para reescrever qualquer propriedade herdada, se a propriedade é herdada para um tipo de armazenamento ou tipo de computação da propriedade.

Subclasse não sabe a propriedade herdada é o tipo de armazenamento ou tipo de cálculo, ele só sabe propriedade herdada vai ter um nome e tipo. Então você reescrever uma propriedade, é necessário nome e tipo de escrita.

precauções:

  • Se você fornecer setter em reescrever propriedades, em seguida, você deve fornecer getter.

  • Se você não quer getter versão reescrita em modificar valores de propriedades herdadas, você pode voltar aos valores herdados por super.someProperty, onde someProperty é o nome que deseja para substituir a propriedade.

O exemplo a seguir definimos uma subclasse de superclasse Circle e Retângulo, reescrevemos área de propriedade de classe do retâ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)")

A saída de execução de programa acima é:

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

Substituindo Visualizador de Propriedades

Você pode adicionar uma propriedade de herdar propriedade nas propriedades observadas na reescrita. Como resultado, quando as alterações de valor da propriedade herdada, você será monitorado.

Nota: Você não pode adicionar propriedades observador para o tipo herdado atribuir memória constantes ou somente leitura computacional propriedade herdada.

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

Impedir reescrita

Podemos usar a palavra-chave final impede-os de serem substituídos.

Se você substituir um método final, propriedade ou roteiro subscrito, pelo erro de tempo de compilação.

Você pode adicionar o final antes da palavra-chave class característica (classe final) para toda a classe é marcada final, de modo que a classe não pode ser herdada, caso contrário, erros de compilação será relatado.

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

Devido ao exemplo acima usa a palavra-chave final não é permitido para reescrever, então será dado execução:

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