是否存在关联类型不应受具体类型约束的非书面规则?
Is there any non written rule that an associatedtype shouldn't be constrained by a concrete type?
class Human {
var name : String?
}
class Man : Human {
var numberOfWallets : Int?
}
class Woman : Human {
var numberOfPurses : Int?
}
protocol P {
associatedtype Person : Human
func printX(of person : Person)
func printY(of person: Person)
}
它允许 Human
成为它的 typealias
:
class C : P {
typealias Person = Human
func printX(of person: Human) {
print(person.numberOfCars)
}
func printY(of person: Human) {
print(person.name)
}
}
如您所见,Person
类型受 Human
约束,而 Human
本身就是一个具体类型。我想知道这是否常见。我的直觉告诉我,这实际上是我不应该使用协议的标志,而 类 本身就很好。
或者我应该做
protocol P {
associatedtype Person
func printX(of person : Person)
func printY(of person: Person)
}
class C : P {
func printX(of person: Man) {
print(person.numberOfCars)
}
func printY(of person: Man) {
print(person.name)
}
}
不允许 Woman
和 Man
实例同时用于 C
实例。
我知道这取决于我想做什么。但我的问题确实是:用具体类型约束关联类型是否有意义?!
或者关联类型只是不受协议约束或约束,而不是具体类型...
在这一行
associatedtype Person : Human
约束不具体或不具体。它以并行方式处理两种继承。
• 如果 Human 是协议,Person 必须是 采用 的具体类型。
• 如果 Human 是 class,Person 必须是 后裔 的具体类型。
两者都是有用且合法的,并且彼此非常相似。
class Human {
var name : String?
}
class Man : Human {
var numberOfWallets : Int?
}
class Woman : Human {
var numberOfPurses : Int?
}
protocol P {
associatedtype Person : Human
func printX(of person : Person)
func printY(of person: Person)
}
它允许 Human
成为它的 typealias
:
class C : P {
typealias Person = Human
func printX(of person: Human) {
print(person.numberOfCars)
}
func printY(of person: Human) {
print(person.name)
}
}
如您所见,Person
类型受 Human
约束,而 Human
本身就是一个具体类型。我想知道这是否常见。我的直觉告诉我,这实际上是我不应该使用协议的标志,而 类 本身就很好。
或者我应该做
protocol P {
associatedtype Person
func printX(of person : Person)
func printY(of person: Person)
}
class C : P {
func printX(of person: Man) {
print(person.numberOfCars)
}
func printY(of person: Man) {
print(person.name)
}
}
不允许 Woman
和 Man
实例同时用于 C
实例。
我知道这取决于我想做什么。但我的问题确实是:用具体类型约束关联类型是否有意义?!
或者关联类型只是不受协议约束或约束,而不是具体类型...
在这一行
associatedtype Person : Human
约束不具体或不具体。它以并行方式处理两种继承。
• 如果 Human 是协议,Person 必须是 采用 的具体类型。
• 如果 Human 是 class,Person 必须是 后裔 的具体类型。
两者都是有用且合法的,并且彼此非常相似。