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您知道为什么需要覆盖私有计算属性吗?你认为那个被接受的答案更好吗?在我看来,即使是罗布的回答也不算太好。我的观点是“用最简单的方法来做!”不要试图重新评估装备。