如何覆盖超类中的私有var

时间:2015-11-25 16:20:54

标签: 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
            } 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...
}

4 个答案:

答案 0 :(得分:7)

只需将类和子类放在同一个文件中即可。 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
}

答案 1 :(得分:3)

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

答案 2 :(得分:0)

你可以覆盖计算属性

class C {
    var a: Int { return 10 }
}
class D:C {
    override var a: Int  { return 100 }

答案 3 :(得分:0)

对于Rob的回答的Swift 3版本,您无法覆盖私有,但有趣的是,您可以使用 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
     }
}