从父类类型字段

时间:2017-02-28 17:09:01

标签: java

考虑这些虚假类:

A.java

public class A {
    //
    // implementation...
    //
}

B.java

public class B extends A {
    private Long id;

    public Long getId() {
        return id;
    };

    //
    // B specific implementation...
    //
}

C.java

public class C extends A {
    private Long id;

    public Long getId() {
        return id;
    };

    //
    // C specific implementation...
    //
}

D.java

public class D extends A {
    private Long id;

    public Long getId() {
        return id;
    };

    //
    // D specific implementation...
    //
}

E.java

public class E extends A {
    //
    // E specific implementation...
    //
}

考虑一下您无法更改这些实现的情况,并且您有一个字段A a,它将包含 B C D 当然不会出现a持有 A 类型的对象, E 的情况。

从视觉上讲,访问方法getId()的方式是否比:

更清晰
if (B.class.isInstance(a)) {
    return (Long) ((B) event).getId();
} else if (C.class.isInstance(a)) {
    return (Long) ((C) event).getId();
} else {
    return (Long) ((D) event).getId();
}

我知道这是不可能的,但是这样的事情:

public class X extends B, C, D {
    public Long getId() {
        return super.getId();
    }
}

1 个答案:

答案 0 :(得分:1)

我会在这里使用一些界面:

interface HasId { 
    Long getId(); 
} 

以及实现它的一些自定义B,C,D等:

class YourB extends B implements HasId {
    // nothing
}

class YourC extends C implements HasId {
    // nothing
}

// ...

然后有问题的 if变为

if (a instanceof HasId) { 
    return ((HasId) a).getId();
}