簡體   English   中英

使用僅在運行時可獲得的靜態類型

[英]Use a static type only obtainable at runtime

假設我的情況如下:

X具有場s類型的S

S由兩個類AB擴展,它們都實現了一些我們都知道應該在S實現的相同方法/字段,但不幸的是,情況並非如此。

現在我想做這樣的事情:

"A or B" downcast_field;
if(s instanceof A)
    downcast_field = (A)s;
else if (s instanceof B)
     downcast_field = (B)s;

//do something common for the two cases but that need methods implemented both in A and B

問題是提前有一個靜態類型(在IFs )允許我調用這樣的方法。

我想由於糟糕的設計,這實際上是不可能的,我必須寫兩次相同的代碼,這是丑陋的,但也許有一個我現在沒有看到的解決方案。

如果您可以更改AB ,則可以向兩者添加相同的界面。 這將允許您將此類型提供給downcast_field並調用方法。

如果你不能改變AB ,那么你有兩個選擇:

  • 你可以寫A2B2 將代碼從AB復制到新類型中。 這允許您修改代碼(除非您無法控制這些類型的創建)。 或者,您現在也可以創建S2 ,它擴展S並將公共代碼放在那里,然后從中擴展A2 / B2

  • 創建一個接口,然后創建兩個實現,只是將調用委托給實際類型。

    在這個解決方案中,你可以

     Wrapper downcast_field; if(s instanceof A) downcast_field = new AWrapper( (A)s ); else if (s instanceof B) downcast_field = new BWrapper( (B)s ); downcast_field.foo(); 

    您可以使兩個包裝器擴展相同的類型並在那里移動公共代碼。

據我了解你的情況如下?

public class S {
}

public class A extends S {

    public void doSomething() {
        System.out.println("A is doing something ...");
    }
}

public class B extends S {

    public void doSomething() {
        System.out.println("B is doing something ...");
    }
}

實際上我認為這個設計相當糟糕。 如果你有機會清理它,你應該這樣做。 如果這不是一個選項,則可以采用以下解決方法...引入一個接口,聲明公共API並使用此接口包裝您的實例...

public interface WrapperInterface {
    void doSomething();
}

然后你可以這樣使用它

public class Main {

    public static void main(String[] args) {
        WrapperInterface a=wrap(new A());
        WrapperInterface b=wrap(new B());

        a.doSomething();
        b.doSomething();
    }

    private static WrapperInterface wrap(final S s) {
        WrapperInterface downcast_field=null;
        if (s instanceof A)
            downcast_field = new WrapperInterface() {
                @Override
                public void doSomething() {
                    ((A) s).doSomething();
                }
            };
        else if (s instanceof B) {
            downcast_field = new WrapperInterface() {
                @Override
                public void doSomething() {
                    ((B) s).doSomething();
                }
            };
        }
        return downcast_field;
    }
}

暫無
暫無

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

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