Я думаю, что отношения типов довольно просты здесь, и все же мне не хватает причины ошибки. Ошибка: "Type 'Т' не соответствует протоколу 'EntityType'" (в ThingManager
):Тип 'T' не соответствует протоколу 'EntityType'
//
protocol EntityType {
typealias Identifier
var identifier : Identifier { get }
}
class EntityWithStringIdentifier : EntityType {
var identifier : String
init (i:String) { self.identifier = i }
}
class Thing : EntityWithStringIdentifier {}
//
protocol EntityManager {
typealias Entity : EntityType
func has (entity:Entity) -> Bool
}
class BaseEntityManager<Entity:EntityType> : EntityManager {
func has (entity:Entity) -> Bool { return true }
}
// Type 'T' does not conform to protocol 'EntityType'
class ThingManager<T:Thing> : BaseEntityManager<T> {
}
T
является подтипом Thing
; Thing
является подтипом EntityWithStringIdentifier
, который реализует EntityType
. Итак, почему ошибка?
Видимо ошибка преодолимо с помощью:
class ThingManager<T:Thing where T:EntityType> : BaseEntityManager<T> {
}
, а затем можно создать экземпляр ThingManager
с Thing
(подразумевающее Thing
реализован EntityType
в первую очередь ...)
var tm = ThingManager<Thing>()
От А типа, есть ли лучший способ реализовать такой тип DAO?
Я не понимаю, почему вы так поступаете? Этот запах очень сложный код для простого решения. Вы можете лучше объяснить, что хотите? – ViTUu
@ViTUu Я думаю, что GoZoner хочет сделать, это добиться некоторого полиморфизма. Это на самом деле выглядит для меня довольно простой реализацией. –