Java重写抽象方法设计策略

标签 java oop abstract-class overriding

我有这样的类(class):

abstract class Person{void toDrink(Liquid l);}

class Liquid{}
class Alcohol extend Liquid{}
class Milk extends Liquid{}


class Adult extends Person{void toDrink(Liquid l){}}
class Child extends Person{void toDrink(Liquid l){}}

我希望 child 和成人不要分别采用液体作为参数,而是分别采用牛奶和酒精,但我必须用精确的液体参数覆盖抽象方法。所以当我写的时候

Person child = new Child();
child.toDrink(new Alcohol());

child 可以把酒精当作喝酒的理由。 我可以使用 Exceptions 或 if() 来解决这个问题,但我请你建议我对这些关系有更好的设计。当我向 toDrink() 方法传递错误的参数(向 child 传递酒精或向成人传递牛奶)时,我想要它,当我尝试运行它时,我的 IDE 将其强调为错误和编译错误。

最佳答案

你可以像下面这样创建吗?

abstract class Person<T extends Liquid>{
    void toDrink(T l) {

    }
}

在上面的代码中,您绑定(bind)了 toDrink() 方法来接受扩展 Liquid 的类型

class Adult<T extends Alcohol> extends Person<T>{

    void toDrink(T l){

    }
}

class Child<T extends Milk> extends Person<T>{
    void toDrink(T l){

    }
}

在上面的代码中,您绑定(bind)了 AdultChild 方法的 toDrink() 以接受扩展 的类型分别是酒精牛奶

现在,正如您所期望的,下面的代码失败了(出现编译错误)

    Person<Milk> child = new Child<Milk>();
    child.toDrink(new Alcohol()); // error here

但是这个有效

    child.toDrink(new Milk());

关于Java重写抽象方法设计策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17189450/

相关文章:

.net - .NET 中的继承没用?

java - 如何使用变量定义按钮的命令

java - 一个使用 Java 中 OOP 基本原理的简单项目

c# - 将基类列表转换为派生类列表 - 可能吗?

扩展抽象类的Java过程

java - 如何在 Java 中的 Eclipse 中自动创建抽象类的子类?

java - 创建仅具有 final方法的抽象类有什么好处?

java - 由于错误代码 : Failed to find configured root that contains,无法使用共享图像按钮

java - 修改远程 EJB 方法中的参数

python - 在并发线程中使用类属性