java - 重铸一个继承的领域

标签 java inheritance casting

B 继承AD 继承CD 实例被传递给 B 实例来操作,但是没有覆盖变量或创建新的引用 D 类型看不到 bStuff().

class Ryrich_A { 
  public void aStuff() { System.out.println("a-type stuff"); }
}
class Ryrich_B extends Ryrich_A { 
  public void bStuff() { System.out.println("b-type stuff"); }
}

class Ryrich_C { 
  Ryrich_A a; 
  Ryrich_C(Ryrich_A a) { 
    this.a = a; 
  }
}

class Ryrich_D extends Ryrich_C{    
  Ryrich_D(Ryrich_B b) {
    super(b);
  }

  public void doStuff() {
    a.aStuff();
    // a.bStuff();  --problem--
  }

  public static void main(String[] args) {
    new Ryrich_D(new Ryrich_B()).doStuff();
  }
}

最佳答案

如果 C 的子类应该与 A 的特定子类一起工作(即 D 总是与 B 一起工作>),你可以使 C 通用:

class C<T extends A> { 
    T a; 
    C(T a) { 
        this.a = a; 
    }
    ...
}

class D extends C<B> {    
    D(B b) {
        super(b);
    }
    ...
}

关于java - 重铸一个继承的领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23156299/

相关文章:

java - 如何使用 JSON.org 在 java 中反序列化 JSON

c# - ASP.NET Core - 如何在另一个 Controller 中重用在一个 Controller 中创建的方法?

c++ - 这是合法/安全的 C++ 吗? (向下转换为相同大小的继承类)

inheritance - JPA 多重鉴别器值

java - 是否可以类型转换为父抽象类?

java - 为什么java中的 `package`指令导致class文件无法运行?

java - 如何在java中跨多个类使用变量?

java - Eclipse 与 Jenkins 中的 TestNG 继承行为

javascript - Angular $routeParams 强制变量类型

c++ - 转换正确性 - ID2D1Brush 到 ID2D1SolidColorBrush (DirectX)