覆盖Swift的吸气剂
发布时间:2020-12-14 05:52:15 所属栏目:百科 来源:网络整理
导读:我有一种情况,我需要覆盖一个属性的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 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)" } } } 我得到编译错误:不能用只读属性’name’覆盖mutable属性。 如果我尝试添加setter并覆盖它: 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)" } } } 然后,编译器崩溃… 如何才能实现仅覆盖吸气剂?
这对我有用:
public class MyBaseClass { private var _name: String = "Hi" public internal(set) var name: String { get { return self._name } set { self._name = newValue } } } public class MyDerivedClass:MyBaseClass { override public var name: String { get { return "Derived - (super.name)" } set { super._name = newValue } } } MyDerivedClass().name 编辑 这段代码在操场上适用于我,将其放在“来源” – > SupportCode.swift文件 public class MyBaseClass { private var _name: String = "Hi" public internal(set) var name: String { get { return self._name } set { self._name = newValue } } public init() { } } public class MyDerivedClass:MyBaseClass { override public var name: String { get { return "Derived - (super.name)" } set { // do nothing } } public override init() { } } 这是一个风筝,因为我得到相同的警告,因为内部(集)不能被放置在被覆盖的子类变量之前。这可能是一个bug。而且我也在欺骗,以确保派生类的setter没有任何作用。 内部(集)或私有(集)的更常见的用法是使用类似于文档中的代码: public class MyBaseClass { public private(set) var _name: String = "Hi" public var name: String { get { return self._name } set { self._name = newValue } } public init() { } } public class MyDerivedClass:MyBaseClass { override public var name: String { get { return "Derived - (super.name)" } set { super._name = newValue } } public override init() { } } 在这里,可以直接使用MyDerivedClass()._ name来读取设置器,但不能更改。这个MyDerivedClass()._ name =“Fred”会引发一个错误,但MyDerivedClass()。name =“Fred”将会OK。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |