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