簡體   English   中英

無法實現我打算使用 toString 和繼承的內容

[英]Not able to implement what I intend using toString and inheritance

筆記:

從答案中我可以看出 toString 和繼承不足以實現我的意圖。 請建議一個可以解決我的用例的替代實現。

public class A {
    String c;
    String d;
    A(String c, String d) {
        this.c = c;
        this.d = d;
    }

    @Override
    public String toString() {
        return c + d;
    }
}


public class B extends A {
    String a;
    String b;
    B(String a, String b, String c, String d) {
        super(c,d);
        this.a = a;
        this.b = b;
    }

    @Override
    public String toString() {
        return super.toString() + a + b;
    }

    public static void main(String[] args) {
       B b = new B("a","b","c","d");
       A a = (A)b;
       System.out.println(a);
    }

}

系統輸出正在打印 cdab。

我想要的是在對象 b 被強制轉換為 a 之后,它應該調用 A 類的 toString。 所以我希望輸出是 cd。

另外,我希望 b.toString() 返回 cdab。 但是 ((A)b).toString() 返回 cd。

我想要的是在對象 b 被強制轉換為 a 之后,它應該調用 A 類的 toString。

這是不可能的。

對象的實際類型決定了調用的方法。 鑄造不會改變這一點,其他任何事情也不會。

如果您希望能夠在B實例上調用A.toString() ,則不得覆蓋它。

將對象轉換為其超類的類型無效。 您可以將b分配給a而不進行強制轉換。

BtoString無論如何都會被調用,因為被調用的方法取決於調用它的對象的運行時類型,在你的情況下是B 這就是方法覆蓋的工作方式。

通過保持簡單,您可以說無論轉換后的b是什么,在內部它都是new B("a","b","c","d"); 它將調用B toString 現在,即使在將它轉換為A它也會調用B toString ,因為每個Mango基本上都是Fruit但它將永遠保持Mango

有趣的問題!

嘗試

@Override
public String toString() {
    return super.toString();
}

反而

@Override
public String toString() {
    return super.toString() + a + b;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM