是否存在关联类型不应受具体类型约束的非书面规则?

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)
    }
}

不允许 WomanMan 实例同时用于 C 实例。

我知道这取决于我想做什么。但我的问题确实是:用具体类型约束关联类型是否有意义?!

或者关联类型只是不受协议约束或约束,而不是具体类型...

在这一行

 associatedtype Person : Human

约束不具体或不具体。它以并行方式处理两种继承。

• 如果 Human 是协议,Person 必须是 采用 的具体类型。

• 如果 Human 是 class,Person 必须是 后裔 的具体类型。

两者都是有用且合法的,并且彼此非常相似。