【发布时间】:2015-07-10 09:06:41
【问题描述】:
我有一种情况需要覆盖属性的 getter。
假设我们有:
public class MyBaseClass {
private var _name: String
public internal(set) var name: String {
get {
return self._name
}
set {
self._name = newValue
}
}
}
我猜,没什么特别的。
现在,如果我尝试覆盖派生类中的 getter:
public class MyDerivedClass: MyBaseClass {
public var name: String {
get {
return "Derived - \(super.name)"
}
}
}
我收到编译错误:无法使用只读属性“名称”覆盖可变属性。
如果我尝试添加设置器并覆盖它:
public class MyDerivedClass: MyBaseClass {
public internal(set) var name: String {
get {
return "Derived - \(super.name)"
}
set {
super.name = newValue
}
}
}
我收到错误:覆盖 var 的 Setter 必须与其覆盖的声明一样可访问。
如果我尝试以下操作:
public class MyDerivedClass: MyBaseClass {
public internal(set) var name: String {
get {
return "Derived - \(super.name)"
}
}
}
然后,编译器崩溃了……
我怎样才能实现只覆盖getter?
【问题讨论】:
-
只是为了澄清,您需要一个只能在内部设置但其值在这些维度之外基本上是只读的计算变量(名称):“内部访问使实体能够在内部使用来自其定义模块的任何源文件,但不在该模块之外的任何源文件中。在定义应用程序或框架的内部结构时,通常使用内部访问。而 _name 是私有的,设置和获取仅限于源文件。
-
一位 Swift 编译器工程师在 Twitter 上确认,这种行为看起来像是一个错误。
-
没错,我目前正在尝试创建一个框架,并且我遇到了基类的设置器必须是内部的(这样只有该框架的其他类才能使用它)的情况。我还尝试将
name直接作为存储属性,但后来我无法覆盖getter(如果我没记错的话)。
标签: swift inheritance overriding getter-setter