如何覆盖超类中的私有变量

How to override private var in superclass

所以我有以下超类:

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...

}

但是我该如何处理呢?或者这是否只有在我们不将其设为私有的情况下才有可能?我试图将隐私部分从 window 中删除,但那样也行不通...

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 }

在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)
    }
}

只需将 class 和 subclass 放在同一个文件中即可。 private与继承无关。它与文件范围有关。同一文件中的任何内容都可以访问 private 个成员。

也就是说,您几乎可以肯定不应该在这里使用继承。 Vehicle 几乎可以肯定是一个协议。那么你就不会有继承或 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
}

对于 Rob 的答案的 Swift 3 版本,您不能覆盖私有的,但有趣的是,您可以使用 fileprivate 计算属性。不过,您必须将 class 放在同一个文件中。

我今天做了这个:

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
     }
}