2

我一直在尝试使用此处建议的协议和扩展在 Swift 中创建类似于抽象超类的行为:Swift 语言中的抽象类 但我不知道如何编写使用静态(类)变量的方法。例如,如果我想获取抽象形状类的周长:

protocol Shape {
    static var numSides: Int {get}
    var sideLength: Double {get}
}
class Triangle: Shape {
    static var numSides: Int = 3
    var sideLength: Double
    init (sideLength: Double) { self.sideLength = sideLength }
}
class Square: Shape {
    static var numSides: Int = 4
    var sideLength: Double
    init (sideLength: Double) { self.sideLength = sideLength }
}
extension Shape {
    func calcPerimeter() -> Double {
    return sideLength * Double(numSides)
    }
}

Swift 不希望我在 calcPerimeter 方法中使用静态 var numSides。我知道如果我将它设为实例变量,代码就会运行,但这似乎不是正确的方法。做这个的最好方式是什么?

4

1 回答 1

2

您应该使用 numSide 作为静态变量而不是实例变量。您不能调用 Shape.numSides 但您可以使用Self引用具体类的关键字。尝试这个:

Self.numSides
于 2016-01-13T08:44:04.017 回答