1

我想“制作”一些类似于基类但基础类型不同的类实例。(与网上看到的典型“动物”类工厂示例不太一样!)

下面的代码接近工作,但它需要用户“向上转换”make结果,如下所示:

var f1 = FOO.make(version: FOO.Ver.f1) as! FOO1_32

除了 FOO 之外,我不希望用户知道特定的类类型。我看过其他建议,它们都表明解决方案是使用符合协议的泛型类型定义 make,如下所示:

make<T: FOOProtocol>(version: Ver = .f1) -> T

但是,这给了我在调用 FOO.make(version: FOO.Ver.f1) 时出现的错误“无法推断通用参数'T'”

有人知道怎么做吗?我的游乐场代码如下。

protocol FOOProtocol
{
    associatedtype FOOtype
    var value: FOOtype {get set}
}

class FOO
{
    enum Ver
    {
        case f1
        case f2
    }

    class func make(version: Ver = .f1) -> FOO
    {
        print("FOO make")
        switch version
        {
        case .f1:
            return FOO1_32()

        case .f2:
            return FOO2_64()
        }
    }
}

class FOO1_32: FOO, FOOProtocol
{
    typealias FOOtype = UInt32

    private var fooVal: UInt32 = 0
    var value: UInt32
    {
        get { return self.fooVal }
        set { self.fooVal = newValue }
    }

    override init()
    {
        print("FOO1_32 init")
        self.fooVal = 132
    }
}

class FOO2_64: FOO, FOOProtocol
{
    typealias FOOtype = UInt64

    private var fooVal: UInt64 = 0
    var value: UInt64
    {
        get { return self.fooVal }
        set { self.fooVal = newValue }
    }

    override init()
    {
        print("FOO2_64 init")
        self.fooVal = 264
    }
}

var f1 = FOO.make(version: FOO.Ver.f1)  // requires: as! FOO1_32
let f1v = f1.value
print("\(f1v)")

var f2 = FOO.make(version: FOO.Ver.f2)  // requires: as! FOO2_64
let f2v = f2.value
print("\(f2v)")
4

0 回答 0