Swift: 覆盖子类中的类型别名
Swift: overriding typealias inside subclass
所以我想在我的项目中使用自定义模式,但我无法让它工作。主要思想是更改每个 subclass 上的 typealias
以访问 subclass 特定接口。
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 的概念?!我确实需要在这里 subclass 来避免一遍又一遍地实现 super class' 协议中的所有内容。我的小模式甚至可能吗?我将不胜感激任何帮助。 :)
不幸的是,这个问题没有好的解决方法。
覆盖 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"
}
如果 SecondClass
的 typealias
覆盖另一个 take
方法将起作用,因为它需要一个可以被视为超类的子类。但是 get
方法不能将 FirstClass
隐式转换为 SecondClass
。因此无法覆盖 typealias
.
现在,如果我们想用 get() -> SecondClass
覆盖 get
函数,它将无法工作,因为它与超类中的签名不同。此外,我们继承了 get
方法,这导致使用不明确:
SecondClass().get() // which type gets returned? SecondClass or FirstClass
所以你必须尝试不同的方法。
这样的东西对你有用吗?
class MyClass<T> {
}
class MySubclass1: MyClass<String> {
}
class MySubclass2: MyClass<Int> {
}
所以我想在我的项目中使用自定义模式,但我无法让它工作。主要思想是更改每个 subclass 上的 typealias
以访问 subclass 特定接口。
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 的概念?!我确实需要在这里 subclass 来避免一遍又一遍地实现 super class' 协议中的所有内容。我的小模式甚至可能吗?我将不胜感激任何帮助。 :)
不幸的是,这个问题没有好的解决方法。
覆盖 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"
}
如果 SecondClass
的 typealias
覆盖另一个 take
方法将起作用,因为它需要一个可以被视为超类的子类。但是 get
方法不能将 FirstClass
隐式转换为 SecondClass
。因此无法覆盖 typealias
.
现在,如果我们想用 get() -> SecondClass
覆盖 get
函数,它将无法工作,因为它与超类中的签名不同。此外,我们继承了 get
方法,这导致使用不明确:
SecondClass().get() // which type gets returned? SecondClass or FirstClass
所以你必须尝试不同的方法。
这样的东西对你有用吗?
class MyClass<T> {
}
class MySubclass1: MyClass<String> {
}
class MySubclass2: MyClass<Int> {
}