繁体   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