У недавнего разработчика встретиться с темой struct
наследование в Свифте (точнее отсутствие struct
наследство в Swift) было кратко обсуждено. Я предположил, что причина, по которой Swift не поддерживает struct
наследование потому что:
struct
s являются типами значенийstruct
может варьироваться (например, если Lorry
наследуется от Vehicle
а также Lorry
добавляет .weightCapacity
затем Lorry
потребуется больше места, чем Vehicle
)Я предполагаю, что это из-за этих сложностей, которые предположительно добавили бы дополнительные операции к каждому вызову функции, который включает struct
и, таким образом, ухудшить производительность, что Swift не позволяет struct
наследование. Это рассуждение правильно?
Но тогда я подумал о C ++. C ++ позволяет struct
наследование и C ++ очень ориентированы на производительность. Это заставляет меня думать, что мои рассуждения о Свифте не позволяют struct
наследование это неправильно. Как достигается C ++ struct
наследование без негативного влияния на производительность?
Как в C ++ достигается структурное наследование без негативного влияния на производительность?
В C ++ компилятор всегда знает размер struct
, Но когда базовый класс копируется по значению, объект «разрезается»: копируются только члены базового класса, и новый объект никоим образом не связан с производным классом исходного объекта.
Так что если функция хочет сделать что-то с Vehicle
без выделения его дополнительной идентичности, он должен использовать указатель или ссылку на Vehicle
как тип параметра функции или тип возвращаемого значения. Но в этот момент у вас больше нет «типов значений, скопированных между кадрами стека».
Поскольку структуры являются типами значений, вы должны скопировать их в функцию и обратно. Таким образом, вы могли бы вызвать не мутантный метод с производной структурой, но не смогли бы вернуть производное значение из него, поэтому
struct Vehicle {
var color: Color
mutating func paintWhite() {
self.color = .White
}
}struct Lorry: Vehicle ...
var lorry = Lorry(color:.Blue)
lorry.paintWhite() // <- wouldn't work, as paintWhite takes inout Vehicle
Без возможности вызывать мутантные методы структуры были бы гораздо менее полезными и намного более запутанными.