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

尝试实现supertrait中声明的函数时出错

  •  2
  • GladstoneKeep  · 技术社区  · 3 年前

    我试图实现一种具有超特质的特质,比如:

    trait A {
        fn do_a(&self);
    }
    
    trait B: A {
        fn do_b(&self);
    }
    
    struct S {}
    
    impl B for S {
        fn do_a(&self) {}
        fn do_b(&self) {}
    }
    

    error[E0407]: method `do_a` is not a member of trait `B`
      --> src/example.rs:12:5
       |
    12 |     fn do_a(&self) {}
       |     ^^^^^^^^^^^^^^^^^ not a member of trait `B`
    
    error[E0277]: the trait bound `example::S: example::A` is not satisfied
      --> src/example.rs:11:6
       |
    5  | trait B: A {
       |          - required by this bound in `example::B`
    ...
    11 | impl B for S {
       |      ^ the trait `example::A` is not implemented for `example::S`
    

    我一直在重读有关超级特质的文章,但我很难理解这个错误。

    • trait B: A
    • do_a(&self) {} A .

    1 回复  |  直到 3 年前
        1
  •  1
  •   Jared Smith    3 年前

    我认为语法更多的是关于类型的边界(例如,类型 T B 必须 必然实施 A )而不是面向对象意义上的继承。如果你写下 impl

    trait A {
        fn do_a(&self);
    }
    
    trait B: A {
        fn do_b(&self);
    }
    
    struct S {}
    
    impl A for S {
        fn do_a(&self) {}
    }
    
    impl B for S {
        fn do_b(&self) {}
    }
    

    Playground

    A. 属于 B impl A 他不再满足了。