gpt4 book ai didi

java - Java 中的抽象方法即使被重写也可以具有默认行为吗?

转载 作者:行者123 更新时间:2023-11-30 05:47:14 25 4
gpt4 key购买 nike

也许方法是错误的。我的想法如下:

public abstract AbstractParser<T extends Value> {
T value;

//want to do something like
public abstract void parseSomething(Model model) {
value = (T) model.getValue()
}
}

然后我希望每个子类都重写 parseSomething 而不会丢失默认行为。因此,当子级重写 parseSomething 时,它将在 value 中拥有它的正确实现。

public ConcreteParser extends AbstractParser<ConcreteValue> {
//now in Value I have a ConcreteValue to access

@Override
public void parseSomething(Model model) {
//here I want to do stuff with value without having to do:
value = (ConcreteValue) model.getValue();
//in every implementation I create
}
}

有什么想法吗?

最佳答案

缺少的第一个,您需要 Class<T>对于 Actor T (键入删除)。 (如果模型不可参数化。)

对于这个问题有一个很好的解决方案,与

  • 最终的、不可重写的公共(public) API 服务方法 - parseSomething ;
  • 应该重写的内部、 protected 请求实现方法 - onParseSomething。

可重写的方法在最终的公共(public)方法中调用,并且可以有更多参数,例如值。该方法可以是abstract .

所以:

public abstract AbstractParser<T extends Value> {
private final Class<T> valueType;
protected T value;

protected AbstractParser(Class<T> valueType) {
this.valueType = valueType;
}

// Class users will call this method
public final void parseSomething(Model model) {
value = valueType.cast(model.getValue());
onParseSomething(model, value);
}

// Class implementors will override/implement this method
protected void onParseSomething(Model model, T value) {
}
}


public ConcreteParser extends AbstractParser<ConcreteValue> {

public ConcreteParser() {
super(ConcreteValue.class);
}

@Override
public void onParseSomething(Model model, ConcreteValue value) {
}
}

关于java - Java 中的抽象方法即使被重写也可以具有默认行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54632803/

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