代码之家  ›  专栏  ›  技术社区  ›  mfaani

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

  •  -1
  • mfaani  · 技术社区  · 7 年前
    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 类型受约束 人类 它本身就是一种具体的类型。我想知道这是否常见。我的直觉告诉我,这实际上是一个信号,表明我不应该使用协议,相反,类本身也很好。

    或者我应该这么做

    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 实例。

    我知道这取决于我想做什么。但我真正的问题是:用具体的类型约束一个asscoatedType有意义吗?!

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   matt    7 年前

    在这条线上

     associatedtype Person : Human
    

    约束是否具体。对于这两种继承,它都是并行工作的。

    如果人类是一种协议,那么人必须是一种具体的类型, 采用 它。

    如果人是一个阶级,那么人必须是一个具体的类型 下降 从它开始。

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