繁体   English   中英

继承 - 重写mutator方法?

[英]Inheritance - overriding mutator methods?

所以,假设我有以下课程:

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);
    }
}

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

这是不正确的,因为你使子类比超类更具限制性:超类可以设置任何类型的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> {
}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM