所以我有以下超类:
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...
}
答案 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
}
}