Я считаю, что vale верна, что в этом случае обычно рассматриваются протоколы. В дополнение к определению протокола для requestKey
, я бы также реализовать request
как реализация по умолчанию протокола:
// define Furniture protocol
protocol Furniture {
static var requestKey: String { get }
static func request()
}
// implement default implementation in extension
extension Furniture {
static func request() {
print("class key => \(self.requestKey)")
}
}
// both Chair and Table conform to this protocol
class Chair: Furniture {
static let requestKey = "jsonchairs"
}
class Table: Furniture {
static let requestKey = "tables"
}
Заметьте, я предполагаю, что Furniture
базовый класс не был действительно нужен, так что я co-opted для моего протокола. Вам просто нужно решить, действительно ли вам нужен базовый класс Furniture
. Мое правило, поскольку я перешел от объектно-ориентированного к протоколовому программированию, состоит в том, могут ли быть конкретные экземпляры этого типа Furniture
, или же он больше абстрактного/виртуального типа, который используется просто для определения некоторого общего поведения другие типы, которые в конечном итоге будут созданы (т.е. Chair
и Table
).
Если Furniture
действительно конкретный тип, тогда вам нужно будет найти способ достижения желаемого, не используя типы или методы static
, потому что вы не можете переопределить статику. Если вы покажете нам, как вы используете этот тип Furniture
в дополнение к типам Chair
и Table
, мы можем помочь вам реорганизовать его таким образом, чтобы вам не нужны методы и типы static
.
Но если Furniture
не является конкретным типом, тогда я предлагаю подтолкнуть себя и посмотреть, сможете ли вы выполнить все, что нужно, с помощью протокола. Когда вы делаете переход от объектно-ориентированного программирования к протоколо-ориентированному программированию, для его поиска требуется немного времени. Просто не будьте слишком Crusty. Для получения дополнительной информации см. WWDC 2015 video Protocol-Oriented Programming in Swift или эквивалент WWDC 2016 video Protocol and Value Oriented Programming in UIKit Apps.
В стороне, даже если вы примете этот шаблон, ориентированный на протокол, я бы не склонен использовать типы или методы static
в вашем конкретном примере, но это отдельный вопрос. Вышеупомянутый ориентированный на протокол шаблон работает одинаково хорошо для методов static
, как это делают, например, методы.
Зачем вам нужна статика здесь? У вас может быть переменная-член, такая как furnitureType, и может переопределить ее в инициализаторе соответствующих подклассов. – Shripada
Любой класс instanciated, я использую только метод класса ... –