我不确定如果可能的话,如何编写调用它的构造函数的方法,从通用已知基类继承的泛型类型< T:基础>创建T的一些实例而不依赖于显式工厂函数,即通过类型推断提供所有铃声和口哨。
在游乐场工作的示例:
// Let there be classes MyPod and Boomstick with common Base (not important)
class Base : Printable {
let value : String; init(_ value : String) { self.value = "Base." + value }
var description: String { return value }
}
class MyPod : Base {
init(_ value: String) { super.init("MyPod." + value) }
}
class Boomstick : Base {
init(_ value: String) { super.init("Boomstick." + value) }
}
// PROBLEM: do not know how to force call of Boomstick(n) instead of Base(n) in here
func createSome<T : Base>() -> T[] {
var result = Array<T>()
for n in 1...5 {
result += T(toString(n))
}
return result
}
// This seems to be fine.
// I was expecting call of createSome<Boomstick>() { ... result += Boomstick(n) ...
let objs : Boomstick[] = createSome()
// Prints: Base.1, Base.2, ... not much wished Boomstick.1, Boomstick.2, ...
println(objs)
一个明显的解决方案是将创建委托给调用者,但这似乎很笨拙:
func createSome<T>(factory : (Int)->T) { ... }
谢谢。
PS:不是指定createSome() - &gt; Base []指向objs:Boomstick []类型安全违规?
答案 0 :(得分:5)
现在我对为什么没有答案,但是使用初始化程序定义协议似乎只能起作用:
protocol A {
init(_ value: String)
}
您可以在所有类中实现此协议,如下所示
class Base : Printable, A {
let value : String;
init(_ value : String) { self.value = "Base." + value }
var description: String { return value }
}
class MyPod : Base, A {
init(_ value: String) { super.init("MyPod." + value) }
}
class Boomstick : Base, A {
init(_ value: String) { super.init("Boomstick." + value) }
}
并在A
func中使用Base
而不是createSome()
func createSome<T : A>() -> [T] {
var result = Array<T>()
for n in 1...5 {
result += T(toString(n))
}
return result
}
在操场上测试:
let objs : [Boomstick] = createSome()
objs[0]
并打印:
{value "Base.Boomstick.1"}
还尝试使用MyPod
和Base
并打印出预期结果。
测试一下,让我知道它是否适合你。