Generic on class that is subclassed
在我用 Swift 编写的应用程序中,我有以下类结构。 A 类有一个静态方法,它可以做一些事情,但在一个非常简单的形式中,它看起来像下面的代码。
1
2 3 4 5 6 |
class A {
class func create<T: A>() -> T? { println(NSStringFromClass(T)); return nil; } } |
类
1
2 |
class B : A {
} |
现在,当我执行以下代码时,println 命令输出
1
|
var myVar:B? = B.create();
|
我不确定我在这里做错了什么,但我希望它输出
在
您在
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class A { required init() {} class func create() -> Self { return self() } func test() -> String { return"A" } } class B : A { override func test() -> String { return"B" } } let b = B.create() //"{A}" according to the playground, but it is a"B" instance! |
请注意,
编辑:
我相信上面的代码不是您想要的,现在我确实得到了您想要做的。我建议不要根据实际的类名来这样做,而是使用泛型类为您创建实例:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
protocol Entity {
init() class func entityName() -> String } class EntityFactory<T : Entity> { class func newEntity() -> T? { var entity: T? // … create entity here using T.entityName() return entity } } class Person : Entity { required init() {} class func entityName() -> String { return"Person" } } let person = EntityFactory<Person>.newEntity() |
认为这是一个更优雅的解决方案,它将创建实体的责任转移到一个单独的泛型类中。这会产生可维护和可测试的代码。您甚至可以将其进一步抽象出来用于单元测试目的,但这似乎有点超出范围。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/268632.html