Swift 5如何实现仅一级子类可访问父类属性,禁止隔代子类访问
Swift 5 禁止隔代子类访问基类变量的实现方案
可以实现,Swift本身没有其他语言的protected关键字,但可以通过final修饰符搭配访问控制语法实现你需要的效果,无需依赖Protocol。
你示例里的写法调整后如下:
class A { var a: String = "" } class B : A { // final确保B的所有子类无法再重写该属性,private限制仅B类内部可访问 final override private var a: String { get { super.a } set { super.a = newValue } } } class C : B { func use_a() { a = "test" // 编译器直接报错:'a' is inaccessible due to 'private' protection level } }
实现原理
final修饰重写的属性后,B的所有后代类都无法再重写a,彻底阻断后代修改访问规则的可能- 访问权限收紧为
private后,只有B类的内部作用域可以访问a,所有继承自B的子类都没有访问权限 - 如果需要保留B类内部可写、外部可读的能力,可以把权限调整为
final override private(set) var a: String,仅禁止B类外部修改属性
内容的提问来源于stack exchange,提问作者user1709076
相关产品推荐
相关产品推荐

