继承 - 重写mutator方法?

时间:2011-12-05 13:49:46

标签: java inheritance override

所以,我们说我有以下课程:

abstract class Foo{
    .
    .
    .
    public void setKey(FooKey key){
        this.key = key;
    }
}

酒吧

final class Bar extends Foo{
    .
    .
    .
    @Override
    public void setKey(BarKey key){ // Can't do this?
        super.setKey(key);
    }
}

在上面的示例中,BarKeyFooKey的子类。在这里,我想确保为Bar设置的密钥是FooKey的特定子类(即BarKey)。我该怎么做?我是否过于复杂?有更好的设计方法吗?

4 个答案:

答案 0 :(得分:4)

这是不正确的,因为您使子类比超类更具限制性:超类可以设置任何类型的FooKey,但子类只接受BarKey。

为了做到这一点,你需要使超类通用:

abstract class Foo<K extends FooKey> {
    private K key;

    public void setKey(K key){
        this.key = key;
    }
}

final class Bar extends Foo<BarKey> {
}

答案 1 :(得分:2)

你不能这样强制执行。考虑:

Bar b = new Bar();
FooKey k = new FooKey();
b.setKey(k);  // You want to prohibit this
Foo f = b;
f.setKey(k);  // But there's no way to prohibit this

通常,派生类不能提供更多限制性接口而不是超类。

所以我建议从抽象类中删除setKey

答案 2 :(得分:2)

您应该阅读覆盖和重载之间的区别。你所做的只是重载,因为你改变了覆盖不允许的参数类型。

答案 3 :(得分:0)

简单地删除@Override注释,因为你没有覆盖超类的方法(应该是相同的参数),你只是定义一个更窄类型的新setKey方法。但是,这个新的setKey方法只能通过Bar引用访问。