gpt4 book ai didi

java - 使用多态参数覆盖方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:31 24 4
gpt4 key购买 nike

我有一个接口(interface)(称为 Subject),它具有以下方法:

public void addObserver(Observer o);

然后我有另一个扩展 Subject 的接口(interface),称为 TimerSubject。这个接口(interface)是Subject的一个更具体的版本,用于计时。它还有一些其他杂项方法。

还有相应的两个接口(interface),ObserverTimerObserverTimerObserver 扩展 Observer

当一个类实现TimerSubject 时,它必须覆盖Subject 接口(interface)中的addObserver() 方法。看起来像这样:

@Override
public void addObserver(**Observer e**) {
observers.add(e);
}

问题是,我需要接受 TimerObserver 而不是 Observer 的方法,它看起来像这样:

@Override
public void addObserver(**TimerObserver e**) {
observers.add(e);
}

这不起作用,因为参数与被覆盖方法的参数不同。

那么有没有办法用多态参数覆盖方法?

最佳答案

我不得不做一次这样的事情,我最终做的是模板化,即

interface Subject<T extends Observer> {
public void addObserver(T e);
}

class TimerSubject implements Subject<TimerObserver> {
// ...
@Override
public void addObserver(TimerObserver e)
{
observers.add(e);
}
}

这使 addObserver 方法保持多态并静态强制执行参数类型。

这里的想法是,如果你想让 Subject 接口(interface)的每个具体实现者添加不同种类的观察者。所以你让 Subject 界面要求它。通过让通用类 T 扩展 Observer,您仍然可以保证使用 addObserver 方法的人仅用于添加 Observer,这是一个好处。这样你也可以写一个多态的getter,比如

public T getObserver(T e);

为任何派生类填写类型。这样

Subject<?> foo = new TimerSubject();
// add observer somewhere
Observer bar = foo.getObserver();

也将进行静态类型检查。 (注意:我在这里处理内存,所以最后一点可能不完全正确,但肯定有某种方法可以做到这一点。)

关于java - 使用多态参数覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10023279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com