因此,我在考虑项目中的自定义模式,但无法使其正常工作。主要思想是更改每个子类上的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"
}
如果
typealias
的SecondClass
覆盖了另一个,则take
方法将起作用,因为它采用了一个可以视为父类(super class)的子类。但是get
方法不能隐式将FirstClass
转换为SecondClass
。因此,不可能覆盖typealias
。现在,如果我们想用
get
覆盖get() -> SecondClass
函数,它将不起作用,因为它的签名与父类(super class)中的签名不同。另外,我们继承了get
方法,这导致使用不明确:SecondClass().get() // which type gets returned? SecondClass or FirstClass
因此,您必须尝试另一种方法。