gpt4 book ai didi

java - 确保方法被执行,即使被覆盖

转载 作者:行者123 更新时间:2023-11-29 09:54:11 26 4
gpt4 key购买 nike

假设我有一个带有一些方法的接口(interface),如下所示:

interface Task {
void before();
void doStuff();
void after();
}

这里我会实现其中的一部分:

abstract class PoliteTask implements Task{

@Override
public void before() {
System.out.println("Hey");
}


@Override
public abstract void doStuff();


@Override
public void after() {
System.out.println("Cya");
}

}

现在我想确保在所有扩展类中调用那些 before()after() 实现。

这里我们有一个类需要在 before() 中初始化一些东西:

class ActualStuffTask extends PoliteTask {

private int fancyNumber;


@Override
public void before() {
// init some things
fancyNumber = 42;
}


@Override
public void doStuff() {
System.out.println("Look, a number: "+fancyNumber);
}

}

显然,ActualStuffTask 覆盖了 before(),因此它不会说“Hey”,只会说“Cya”。

如果我在 PoliteTask final 中创建方法,这不会发生,但它的子类无法覆盖这些方法。

ActualStuffTask 中调用 super.before() 会起作用,但我想保证这种效果,无论子类实现如何。

问题是:

我应该使用什么模式来实现父实现和子实现?

最佳答案

我喜欢使用您在实现类中实现的抽象方法。

abstract class PoliteTask implements Task{

@Override
public final void before() {
System.out.println("Hey");
doBefore();
}

protected abstract void doBefore();
protected abstract void doAfter();

@Override
public abstract void doStuff();


@Override
public final void after() {
System.out.println("Cya");
doAfter();
}

}

class ActualStuffTask extends PoliteTask {
private int fancyNumber;

@Override
protected void doBefore() {
// init some things
fancyNumber = 42;
}


@Override
public void doStuff() {
System.out.println("Look, a number: "+fancyNumber);
}


@Override
protected void doAfter() {
// something else
}
}

请注意 Task 方法是 final。他们不需要。这取决于您构建 API 的方式。

关于java - 确保方法被执行,即使被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434584/

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