Swift - возвращает тип подкласса в переопределенной функции суперкласса - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь быстро реализовать дизайн объекта Chainable. Это моя структура:

class A{
    func get() -> some A{
        return self
    }
}

class B:A{
    func set(){

    }
}

Могу ли я создать метод, который будет работать, даже если я создам подкласс исходного класса? В моем примере, если я вызываю get на B, я получаю объект типа A, у которого нет метода с именем set.

let b = B()
b.get().set() // A has no member 'set'

Итак, чтобы это сработало, я пришлось бы вручную переопределить каждую функцию из A в B, что не самое худшее, так как я могу вызвать super, но все равно тратить время и дублировать код.

1 Ответ

6 голосов
/ 05 мая 2020

Если вам действительно не нужно использовать непрозрачный тип с ключевым словом some, вы можете получить то, что хотите, используя протоколы и расширения:

protocol Chainable { 
    func get() -> Self 
} 
extension Chainable { 
    func get() -> Self { 
        return self 
    } 
} 
class A: Chainable {}
class B: A { 
    func set() { 
        print("ok") 
    } 
} 

Теперь вы получаете желаемый тип возврата для ваша функция get:

let a = A()
a.get() // Type = A
let b = B()
b.get() // Type = B
b.get().set() // Prints 'ok'

Если вам не нужно повторно использовать это в нескольких иерархиях классов, решение может быть еще проще (спасибо @Joakim Danielson за указание на это):

class A {
    func get() -> Self { 
        return self 
    }
}
class B: A {  
    func set() {  
        print("ok")  
    }  
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...