gpt4 book ai didi

Java重写抽象方法设计策略

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

我有这样的类(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 和 Adult 不将 Liquid 作为参数,而是分别将 Milk 和 Alcohol 作为参数,但我必须完全使用 Liquid 参数覆盖抽象方法。所以当我写

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/

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