Есть ли какое-либо неписанное правило, что связанный тип не должен быть ограничен конкретным типом? - PullRequest
0 голосов
/ 04 декабря 2018
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, который сам по себе является конкретным типом.Мне интересно, если это распространено.Моя интуиция подсказывает мне, что на самом деле это признак того, что мне не следует использовать протоколы, и, скорее, сами классы в порядке.

или я должен просто сделать

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.

Я знаю, это зависит от того, что я хочу сделать.Но мой вопрос на самом деле таков: имеет ли смысл когда-либо ограничивать ассоциированный тип конкретным типом?

1 Ответ

0 голосов
/ 04 декабря 2018

В этой строке

 associatedtype Person : Human

Ограничение не является конкретным или нет.Он работает параллельно для обоих видов наследования.

• Если Human - это протокол, Person должен быть конкретным типом, который принимает it.

• Если Human - это класс, Person должен быть конкретным типом, который происходит от него .

Оба полезны и законны, и очень похожи друг на друга.

...