Swift 继承


Swift继承

Swift中的继承是一种面向对象编程中非常重要的概念,它可以让我们创建一个新的类,并从现有的类中继承属性和方法。在Swift中,我们可以使用class关键字来定义一个类并实现继承。

定义一个继承类

我们可以使用冒号(:)来声明一个类继承自哪个类,例如:

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

class Student: Person {
    var studentId: String
    
    init(name: String, age: Int, studentId: String) {
        self.studentId = studentId
        super.init(name: name, age: age)
    }
}

在上面的例子中,我们定义了一个Person类和一个Student类。Student类是通过继承Person类来实现的。Student类中还额外定义了一个studentId属性,并且通过调用super.init()方法来初始化父类的属性。

访问父类属性和方法

在子类中,我们可以使用super关键字来访问父类的属性和方法。例如,在上面的例子中,我们通过调用super.init()方法来初始化父类的属性。除此之外,还可以使用super关键字调用父类的方法,例如:

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func sayHello() {
        print("Hello")
    }
}

class Student: Person {
    var studentId: String
    
    init(name: String, age: Int, studentId: String) {
        self.studentId = studentId
        super.init(name: name, age: age)
    }
    
    override func sayHello() {
        super.sayHello()
        print("My name is \(name)")
    }
}

在上面的例子中,我们在Student类中通过重写sayHello()方法来调用父类的sayHello()方法。在子类中如果我们需要调用父类的方法,则需要使用super关键字来调用。

重写父类方法

在Swift中,我们可以通过重写父类的方法来实现自己的行为。在子类中通过override关键字来进行重写,例如:

class Animal {
    func makeSound() {
        print("...")
    }
}

class Dog: Animal {
    override func makeSound() {
        print("bark")
    }
}

上面的例子中,我们定义了一个Animal类和一个Dog类,Dog类继承自Animal类。在Dog类中,我们重写了makeSound()方法,使其输出“bark”而不是父类中的“…”。

防止重写父类方法

在Swift中,如果我们希望防止某个方法被子类重写,则可以在父类中使用final关键字来修饰该方法。例如:

class Animal {
    final func makeSound() {
        print("...")
    }
}

class Dog: Animal {
    // 这里编译器会报错:'makeSound()' is inaccessible due to 'final' protection level
    // override func makeSound() {
    //   print("bark")
    // }
}

上面的例子中在Animal类中使用final关键字修饰makeSound()方法,这意味着在Dog类中无法重写该方法。

总结

继承是面向对象编程中很重要的概念,Swift中使用class和冒号(:)来实现继承。在子类中可以使用super关键字访问父类的属性和方法,如果需要重写父类的方法则可以使用override关键字。如果希望防止父类方法被重写,则可以使用final关键字。