Java - 来自父级的相同方法,但使用每个子级的单独属性

标签 java generics methods parameters attributes

我对我的代码有疑问:

public abstract class Jogador {

    String nome;
    int    pontos;
    Jogador (String n) {
        nome = n;
    }
    void aumentaPontos () {
        pontos++;
    }
    abstract <U extends Jogador> boolean melhor (U outro);
}  


class JogadorAdivinha extends Jogador {

    JogadorAdivinha (String n) {
        super(n);
    }

    boolean melhor (JogadorAdivinha outro) {
        if (this.pontos > outro.pontos)
            return true;
        return false;
    }
}  


class JogadorMemoria extends Jogador {
    int rodadasGanhas;

    JogadorMemoria(String n) {
        super(n);
    }

    boolean melhor(JogadorMemoria outro) {
        if (this.rodadasGanhas > outro.rodadasGanhas)
            return true;
        return false;
    }

    void aumentaRodadasGanhas() {
        rodadasGanhas++;
    }

}

我在 Jogador 的两个子类中都会遇到编译问题。
但正如你所看到的,只有 JogadorMemoria 有 rodadasGanhas。
所以,我想知道一种处理这种情况的方法......如果我将类 Jogador 作为方法 melhor() 的参数,我将无法接收 child ......
我该怎么做才能覆盖抽象方法并且不产生难闻的气味??

最佳答案

如果你想在子类中实现这样的方法:

abstract <U extends Jogador> boolean melhor (U outro);

您必须提供override-equivalent实现,例如:

<U extends Jogador> boolean melhor (U outro) { return true; }

您不能删除子类中的类型变量,因为抽象方法的声明表明它必须能够接受 Jogador任何实例作为参数melhor 方法。

<小时/>

如果您希望这些方法具有特定的参数类型,您可以在类级别定义类型变量:

public abstract class Jogador<U extends Jodador<U>> {
  abstract boolean melhor (U outro);
}

然后你可以在子类中实现它:

class JogadorAdivinha extends Jogador<JogadorAdivinha> {
  boolean melhor (JogadorAdivinha outro) { return true; }
}

关于Java - 来自父级的相同方法,但使用每个子级的单独属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043524/

相关文章:

java - 在 Java 中创建一个简单的词法分析器

java - 查找错误 : Possible null pointer dereference warning

java - 内存不一致与线程交错有何不同?

java - 通用类型解析 - 编译器步骤

java - 泛型和字段如何在 Standalone Java 应用程序中辅助 DAO 模式

java - 我远程做这件事对吗? Java 方法

java - 在固定的时间段内等待多个 ExecutorServices 的终止

java - 为什么我们需要提供两次通用信息?

java - eclipse 米洛 : How to get the DataType of method argument?

ios - 方法中包含大括号是什么意思?