因此,我在考虑项目中的自定义模式,但无法使其正常工作。主要思想是更改每个子类上的typealias以获得对子类特定接口(interface)的访问。

protocol InstanceInterface: class {

    typealias Interface

    var interface: Interface { get }
}

// Baseclass
protocol FirstClassInterface: class { /* nothing here for the example */ }

class FirstClass: InstanceInterface, FirstClassInterface {

    typealias Interface = FirstClassInterface

    var interface: Interface { return self }
}

// Subclass
protocol SecondClassInterface: FirstClassInterface {

    func foo()
}

class SecondClass: FirstClass, SecondClassInterface {

    typealias Interface = SecondClassInterface // <--- This does nothing :(

    func foo() { print("hello world") } // Swift 2.0 here
}

// Lets say I want to call foo trough the interface
let test = SecondClass()

test.interface.foo() // 'Interface' does not have a member named 'foo'

我在做错什么吗?还是我误解了一些Swift概念?我确实需要在这里进行子类化,以免一遍又一遍地实现父类(super class)协议(protocol)中的所有内容。我的小图案甚至可能吗?我将不胜感激。 :)

最佳答案

不幸的是,没有解决此问题的好的方法。

在这种情况下,覆盖typealias的主要想法将起作用,但请考虑以下因素:

protocol TakeAndGet {
    typealias T
    func take(value: T)
    func get() -> T
}

class FirstClass: TakeAndGet {
    typealias T = FirstClass

    var property = 0

    func take(value: T) {
        value.property = 4
    }

    func get() -> T {
        return FirstClass()
    }
}

class SecondClass: FirstClass {

    typealias T = SecondClass

    var property2 = "hello"
}

如果typealiasSecondClass覆盖了另一个,则take方法将起作用,因为它采用了一个可以视为父类(super class)的子类。但是get方法不能隐式将FirstClass转换为SecondClass。因此,不可能覆盖typealias

现在,如果我们想用get覆盖get() -> SecondClass函数,它将不起作用,因为它的签名与父类(super class)中的签名不同。另外,我们继承了get方法,这导致使用不明确:
SecondClass().get() // which type gets returned? SecondClass or FirstClass

因此,您必须尝试另一种方法。

10-08 05:54