如何覆盖超类中的私有变量
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
}
}
所以我有以下超类:
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
}
}