如何从通用超类访问子类变量

时间:2015-10-28 19:22:10

标签: java

我正在尝试创建一个泛型方法,但它需要来自子类的数据。有没有办法做到这一点,还是有更好的实施?

我的情况示例:

public class Super {
    public static Object method() {
        return doSomethingWith(specificToSubClassValue);
    }
}

public class Sub1 extends Super {
    public static String specificToSubClassValue = "123";
}

public class Sub2 extends Super {
    public static String specificToSubClassValue = "456";
}
我显然不能这样做。什么是更好的方法?

我能想到的一个替代方法是覆盖每个子类中的#method方法,但是每个实例中的代码都是相同的,所以我想把它放在父类中(它不会成为真正被覆盖,因为它是静态的),但我不知道如何处理它,因为它依赖于子类值。

3 个答案:

答案 0 :(得分:0)

Super中声明一个抽象方法,该方法将用于从实现类返回值。请注意,这只能通过非静态方法实现。根据@JB Nizet的评论,子类不能覆盖静态方法。我已经从下面的代码中删除了静态修饰符,向您展示它是如何工作的。

public class Super {
    public static Object method() {
        return doSomethingWith(specificToSubClassValue);
    }

    protected abstract Object getValue ();
}

public class Sub1 extends Super {
    public static String specificToSubClassValue = "123";

    @Override
    protected Object getValue () {
        return specificToSubClassValue;
    }
}

public class Sub2 extends Super {
    public static String specificToSubClassValue = "456";

    @Override
    protected Object getValue () {
        return specificToSubClassValue;
    }

}

答案 1 :(得分:0)

Java中的静态方法无法被覆盖,无法访问特定于孩子的信息:他们对继承一无所知。

这里需要的是实例方法,您可以覆盖它。您也可以使用泛型。

public class Super<T> {
    public Object method() {
        final T specificToSubClassValue = getSpecificToSubClassValue();
        if (specificToSubClassValue != null) {
            return specificToSubClassValue.hashCode();
        } else {
            return null;
        }
    }

    protected T getSpecificToSubClassValue() {
        return null;
    }
}

class Sub1 extends Super<String> {
    @Override
    protected String getSpecificToSubClassValue() {
        return "abc";
    }
}

class Sub2 extends Super<Integer> {
    @Override
    protected Integer getSpecificToSubClassValue() {
        return 123;
    }
}

答案 2 :(得分:-1)

嗯,继承的整个想法是超类在没有子类的情况下不应该做那么多。否则整个遗产将是毫无意义的运动和意大利面条代码。但是你正在以错误的方式解决这个问题。让子类“溢出”你需要的数据(通过getter),并使用超类中的泛型方法对子类中的数据进行处理。

超级方法的覆盖也被高估了。你应该努力使你的超级方法尽可能灵活和可重复使用,甚至努力争取重载,而不是覆盖。

你可以:

public class Super {
    public Object method(String specificValue) {
        return doSomethingWith(specificToSubClassValue);
    }

然后让你的子做到这一点

public class Sub1 extends Super {
    public static String specificToSubClassValue = "123";
    Object method(specificToSubClassValue);
}

通过这种方式,您可以完成所需的操作,使用super方法对类特定值进行操作。