это своего рода дополнительный вопрос из этого:
Ржавый динамический объект типа черты между разными тайтами
Решение, предоставленное там, работает очень хорошо, когда мы используем ссылки для объектов признаков.
На этот раз я пытался сделать то же самое с указателями Rc. Например
- У меня есть супер-черта с именем
TraitAB
и 2 черты с именами TraitA
и TraitB
- Поэтому, когда я впервые создаю объект черты типа
TraitAB
вместо использования Box
, теперь я использую указатель Rc
.
- Мне нужна переменная типа
TraitA
, которая будет ссылаться на ab
Здесь я сделал очень минимальный пример:
use std::rc::Rc;
trait TraitAB : TraitA + TraitB {
fn as_a(&self) -> Rc<dyn TraitA>;
fn as_b(&self) -> Rc<dyn TraitB>;
}
trait TraitA {}
trait TraitB {}
struct MyType {}
impl TraitAB for MyType {
fn as_a(&self) -> Rc<dyn TraitA> {Rc::clone(self)}
fn as_b(&self) -> Rc<dyn TraitB> {Rc::clone(self)}
}
impl TraitA for MyType {}
impl TraitB for MyType {}
fn main() {
let a: Rc<dyn TraitA>;
let b: Rc<dyn TraitB>;
{
let mut ab: Rc<dyn TraitAB> = Rc::new(MyType{});
a = ab.as_a();
b = ab.as_b();
}
}
Это не работает, хотя. По сообщениям об ошибках:
xx | fn as_a(&self) -> Rc<dyn TraitA> {Rc::clone(self)}
| ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
|
= note: expected type `&std::rc::Rc<dyn TraitA>`
found type `&MyType`
методы as_a
и as_b
не могут знать, что self на самом деле является указателем Rc.
Есть ли способ выполнить приведение клонированного общего указателя?
Спасибо