Swift 如何在超类中重写私有变量
因此,我有以下超类:Swift 如何在超类中重写私有变量,swift,class,subclass,private,superclass,Swift,Class,Subclass,Private,Superclass,因此,我有以下超类: class Vehicle { private var _maxSpeed: Int = 100 var maxSpeed: Int { get { return _maxSpeed } var tooFast: Bool { get { if maxSpeed >= 140 { return false
class Vehicle {
private var _maxSpeed: Int = 100
var maxSpeed: Int {
get {
return _maxSpeed
}
var tooFast: Bool {
get {
if maxSpeed >= 140 {
return false
} else {
return true
}
}
}
}
另外,我有一些子类,我想覆盖maxSpeed。。。每个示例:
class SuperCar: Vehicle {
//override the maxspeed...
}
但我应该如何处理这个问题呢?或者这只有在我们不保密的情况下才有可能?我试着把私人部分扔出窗外,但那也不行
class Vehicle {
var maxSpeed: Int = 100
var tooFast: Bool {
get {
if maxSpeed >= 140 {
return false
} else {
return true
}
}
}
}
class SuperCar: Vehicle {
// override the maxSpeed...
override var maxSpeed: Int = 200
// Will not work...
}
您可以覆盖计算属性
class C {
var a: Int { return 10 }
}
class D:C {
override var a: Int { return 100 }
您可以覆盖计算属性
class C {
var a: Int { return 10 }
}
class D:C {
override var a: Int { return 100 }
在init方法中设置私有成员变量
class Vehicle{
private var maxSpeed: Int
init(maxSpeed: Int = 100){
self.maxSpeed = maxSpeed
}
}
class SuperCar: Vehicle {
override init(maxSpeed: Int = 200){
super.init(maxSpeed: maxSpeed)
}
}
在init方法中设置私有成员变量
class Vehicle{
private var maxSpeed: Int
init(maxSpeed: Int = 100){
self.maxSpeed = maxSpeed
}
}
class SuperCar: Vehicle {
override init(maxSpeed: Int = 200){
super.init(maxSpeed: maxSpeed)
}
}
只需将类和子类放在同一个文件中<代码>私有与继承无关。它与文件范围有关。同一文件中的任何内容都可以访问
private
成员
也就是说,您几乎肯定不应该在这里使用继承<代码>车辆几乎肯定应该是一个协议。这样您就不会有继承或private
的麻烦了
protocol Vehicle {
var maxSpeed: Int {get}
}
extension Vehicle {
// Default implementation if none is given
var maxSpeed: Int { return 100 }
// Another method that applies to all Vehicles
var tooFast: Bool {
return maxSpeed < 140 // (feels like this should be >= 140, but matching your code)
}
}
struct SuperCar: Vehicle {
// override the default implementation for the protcocol
var maxSpeed = 200
}
协议车辆{
var maxSpeed:Int{get}
}
扩展车{
//如果没有给出,则为默认实现
var maxSpeed:Int{return 100}
//适用于所有车辆的另一种方法
var tooFast:Bool{
返回maxSpeed<140//(感觉应该是>=140,但与代码匹配)
}
}
超级跑车{
//重写protocol的默认实现
var maxSpeed=200
}
只需将类和子类放在同一个文件中即可<代码>私有与继承无关。它与文件范围有关。同一文件中的任何内容都可以访问private
成员
也就是说,您几乎肯定不应该在这里使用继承<代码>车辆几乎肯定应该是一个协议。这样您就不会有继承或private
的麻烦了
protocol Vehicle {
var maxSpeed: Int {get}
}
extension Vehicle {
// Default implementation if none is given
var maxSpeed: Int { return 100 }
// Another method that applies to all Vehicles
var tooFast: Bool {
return maxSpeed < 140 // (feels like this should be >= 140, but matching your code)
}
}
struct SuperCar: Vehicle {
// override the default implementation for the protcocol
var maxSpeed = 200
}
协议车辆{
var maxSpeed:Int{get}
}
扩展车{
//如果没有给出,则为默认实现
var maxSpeed:Int{return 100}
//适用于所有车辆的另一种方法
var tooFast:Bool{
返回maxSpeed<140//(感觉应该是>=140,但与代码匹配)
}
}
超级跑车{
//重写protocol的默认实现
var maxSpeed=200
}
对于Rob答案的Swift 3版本,您不能覆盖private,但有趣的是,您可以使用fileprivate计算属性。不过,您必须将该类放在同一个文件中
我今天这样做了:
protocol Renderer {
}
class BaseClass {
private let _renderer: Renderer = BaseClassRenderer()
fileprivate var renderer: Renderer {
return _renderer
}
}
class Subclass: BaseClass {
private let _renderer: Renderer = SubclassRenderer()
override fileprivate var renderer: Renderer {
return _renderer
}
}
对于Rob答案的Swift 3版本,您不能覆盖private,但有趣的是,您可以使用fileprivate计算属性。不过,您必须将该类放在同一个文件中 我今天这样做了:
protocol Renderer {
}
class BaseClass {
private let _renderer: Renderer = BaseClassRenderer()
fileprivate var renderer: Renderer {
return _renderer
}
}
class Subclass: BaseClass {
private let _renderer: Renderer = SubclassRenderer()
override fileprivate var renderer: Renderer {
return _renderer
}
}
和这个问题是关于私人的property@Gargo:-)检查问题,特别是“…我有一些子类,我想覆盖maxSpeed…”,并检查其他答案以查看上下文。重新阅读问题。。。1) “这只有在我们不保密的情况下才可能吗?”;2) 我经常遇到同样的问题。很多初学者读过关于OOP的书,看到“private modifier很酷”,然后用他们的劣质代码垃圾邮件github。如果你面临问题,你不能简单地解决它,因为几乎所有的代码都标记为“private”。同时,在你的回答中没有关于私有/公共修饰符的解释——你只是发布了一段与公共修饰符无关的代码question@Gargo您知道为什么需要覆盖私有计算属性吗?你认为那个被接受的答案更好吗?在我看来,即使是罗布的回答也不算太好。我的观点是“用最简单的方法去做!”不要试图重新评估装备?这个问题是关于私人的property@Gargo:-)检查问题,特别是“…我有一些子类,我想覆盖maxSpeed…”,并检查其他答案以查看上下文。重新阅读问题。。。1) “这只有在我们不保密的情况下才可能吗?”;2) 我经常遇到同样的问题。很多初学者读过关于OOP的书,看到“private modifier很酷”,然后用他们的劣质代码垃圾邮件github。如果你面临问题,你不能简单地解决它,因为几乎所有的代码都标记为“private”。同时,在你的回答中没有关于私有/公共修饰符的解释——你只是发布了一段与公共修饰符无关的代码question@Gargo您知道为什么需要覆盖私有计算属性吗?你认为那个被接受的答案更好吗?在我看来,即使是罗布的回答也不算太好。我的观点是“用最简单的方法来做!”不要试图重新评估装备。