Я пытался создать абстрактное поведение, подобное суперклассу, в 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 не хочет, чтобы я использовал static var numSides в методе calcPerimeter. Я знаю, что если бы я сделал это переменной экземпляра, код запустился бы, но это не похоже на правильный путь. Как лучше всего это сделать?