Странная неоднозначность для веселья класса c () в унаследованных классах [Swift] - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть простая иерархия классов, подобная этой в Swift.

class Parent {
    var name:String = "Unnamed"
    class func all() -> [Parent] {
        return Dad.all() + Mom.all()
    }
}

class Dad:Parent {
    static var AllDads:[Dad] = []

    class func all() -> [Dad] {
        return AllDads
    }
}

class Mom:Parent {
    static var AllMoms:[Mom] = []

    class func all() -> [Mom] {
        return AllMoms
    }
}

Mom.all().forEach { mom in
    print(mom.name)
}

Если я помещу это в рабочее пространство, все будет хорошо, пока я не нажму кнопку запуска. В этот момент он говорит мне, что последнее выражение Mom.all() неоднозначно. Почему это? Разве нет способа получить класс fun c, который уточняет в подклассе для подтипа и сохраняет их однозначными?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Причина в том, что all на Parent и all на Mom имеют разные подписи. Таким образом, all на Mom не может быть переопределением для этого на Parent (что также подтверждается тем фактом, что компилятору не требуется ключевое слово override). Это означает, что две функции класса с именем all существуют с типом Mom. Кроме того, замыкание, которое вы передаете forEach, не указывает тип параметра, поэтому невозможно быть уверенным в том, на какую из двух функций ссылаются. Присвоение типа параметру mom в forEach решит эту проблему.

0 голосов
/ 06 февраля 2020

Пока вы не создадите экземпляр Mom и не вызовете его для этого экземпляра Mom, это будет неоднозначно.

...