跳到主要内容

Swift中,如何阻止方法,属性,下标被子类改写?

参考答案:

在 Swift 中,你可以使用访问控制修饰符来控制子类是否可以改写父类的方法、属性或下标。特别是,你可以使用 final 关键字来声明一个类、方法、属性或下标为最终的,这意味着它们不能被继承或重写。

以下是如何使用 final 来阻止方法、属性和下标被子类改写的示例:

阻止方法被子类改写

class ParentClass {
    final func someMethod() {
        // 这个方法不能被子类改写
    }
}

class ChildClass: ParentClass {
    override func someMethod() { // 编译错误:'someMethod()' 被声明为 final,因此不能重写
        // 试图改写父类的方法会导致编译错误
    }
}

阻止属性被子类改写

class ParentClass {
    final var someProperty: Int = 0 {
        // 这个属性不能被子类改写
    }
}

class ChildClass: ParentClass {
    override var someProperty: Int { // 编译错误:'someProperty' 被声明为 final,因此不能重写
        get { return 0 }
        set { }
    }
}

阻止下标被子类改写

class ParentClass {
    var array = [Int]()
    
    final subscript(index: Int) -> Int? {
        get {
            return array[safe: index]
        }
        set {
            array[index] = newValue
        }
    }
}

class ChildClass: ParentClass {
    subscript(index: Int) -> Int? { // 编译错误:'subscript(index:)' 被声明为 final,因此不能重写
        get { return 0 }
        set { }
    }
}

在上面的例子中,final 修饰符确保了 someMethod 方法、someProperty 属性和下标 subscript(index:) 都不能在子类中被重写。如果你尝试在子类中重写它们,你会得到一个编译错误。

另外,你也可以将整个类声明为 final,这意味着该类不能被继承,从而自然地阻止了它的所有方法、属性和下标被重写:

final class FinalClass {
    func someMethod() {
        // 这个类不能被继承,因此其中的方法、属性和下标也不能被重写
    }
}

在这个例子中,由于 FinalClass 被声明为 final,因此它不能被继承,因此其中的 someMethod 方法也不能被子类重写。