【问题标题】:How to handle polymorphism without casting object?如何在不转换对象的情况下处理多态性?
【发布时间】:2021-07-29 13:48:31
【问题描述】:
 class A{
    int a;
    
    public int getA(){
        return a;
    } 
    
    public void setA(int a){
        this.a=a;
    }
}

// B类扩展A类并添加一个额外的变量

 class B extends A{
    int b;
    public int getB(){
        return b;
    } 
    
    public void setB(int b){
        this.b=b;
    }
}

//这是主类

class HelloWorld {
    public static void main(String[] args) {
        
        A aa;
          if(runtime conditon)   {         
                aa= new B();
                  aa.setA(3);
                  ((B)aa).setB(4); 
            }
          else{
          aa= new A();
                  aa.setA(3);
          }
}
}
         


        

如何在不使用强制转换的情况下设计解决上述问题? 很抱歉提出低级问题(我是 java 新手)。

【问题讨论】:

  • 在您的第一个条件中,创建B 的实例并将其分配给B,进行更改,然后将该实例分配给aa
  • 要使多态性起作用,您应该阅读有关 Liskov 替换原则的内容。这意味着 A 的所有子类都应该可以用作 A 对象。在你的情况下,我会将 set/get B 方法移到 A 中。
  • 在现实生活中,我能想到的最好的例子是 gui 库的视图层次结构,例如 Swing。

标签: java inheritance polymorphism multiple-inheritance


【解决方案1】:

由于 B 类扩展了 A 类,因此您可以使用 A 类型的变量来指向 B 类型的变量。 但是,如果您只想使用 A 类型的一个变量(在您的情况下为 aa),则不能在不强制转换对象的情况下使用 B 类的方法。

因为您必须记住,当您使用指向派生类型的变量(在您的案例类型 A 中)使用(在您的案例类型 B 中)时,您只能使用类 A 中定义的方法,即其余的都被掩盖了。通过将对象转换为其真实类型,您可以使用它的所有方法。

【讨论】:

    【解决方案2】:

    引入另一个变量:

    B bb= new B();
    bb.setA(3);
    bb.setB(4); 
    aa = bb;
    

    【讨论】:

    • 如果我想传入另一个类 C.test(aa) class C{ public static void test(A a){ 并且我想在这里打印 b 值我认为它不起作用} }跨度>
    • @KuldeepSingh 这不是你在问题中问的。
    • 如果您想从 B 打印一个值,您需要确保(对您和编译器)该实例确实是 B 类型或其子类型之一。因此,如果您确实需要 B 类型,请不要将变量声明为 A 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2020-12-21
    相关资源
    最近更新 更多