You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:06:03