gpt4 book ai didi

java - 如何修改包外预定义的包方法?

转载 作者:行者123 更新时间:2023-12-02 08:29:28 25 4
gpt4 key购买 nike

假设我有一个名为“animal”的包,其中包括 Animal 父类,Cat 继承自 Animal,Dog 也继承自 Animal。然而,Animal 的设计是这样的:

class Animal {
int amount;
Animal next; // Then a constructor initializes these.

drinkWater(int n) { ... }
}

猫和狗类遵循以下结构:

class Cat extends Animal {
Cat(int amount, Animal next) {
super(amount, next);
}

@Override
drinkWater(int n) { .. }
}

它们每个都有方法,drinkWater(),如下所示:

public void drinkWwater(int n) {
amount -= n;
if (amount < 0) amount = 0;
if (next != null) next.drinkWater(n);
}

我现在想做的是创建一个动物的“链接列表”,每个动物都按顺序喝水。但是,假设一只猫喝了 n 份水,它会将 n+1 份水传递给它的下一个

我的目的是找到一种解决方案来克服“不接触原始动物包装,但改变每只动物的饮水行为”的问题。我已经用一个类提供了那个“著名的”天真的解决方案:

class InvokeStaticTypeBDrink {
static void typeBdrink(Animal animal, int n) {
animal.amount -= n;
if (animal.amount < 0) animal.amount = 0;
if (animal.next != null) {
if (animal instanceof Cat)
InvokeStaticTypeDrink.drinkWater(animal.next, n+1);
else if (animal instanceof Dog)
InvokeStaticTypeDrink.drinkWater(animal.next, n-1);
else
InvokeStaticTypeDrink.drinkWater(animal.next, n);
}
}
}

然后,我开始研究。因为这确实看起来又快又脏的解决方案。

所以,我发现了一种称为“访问者模式”的设计模式。嗯,这是一个很酷的模式,它解决了双重调度的问题,但我这边有一个问题:Visible 接口(interface)(声明accept() 方法)应该由原始的 Animals '实现'。然而,我的目标是“不要对原始动物包装进行任何修改,但要改变饮用水行为”。我很确定我错过了一些东西。

那么,您认为稍微修改一下,访问者模式仍然有效,还是其他模式/解决方案会更好?谢谢。

最佳答案

如果您不想触及原始类,那么应用访问者模式的唯一方法是将原始类包装在新的(包装器)类中。

无论如何,如果您只是想改变某些动物的行为,那么在您的情况下,我只会扩展这些特定类别覆盖饮酒行为。 p>

那么你就会有一只这样的猫:

class NonThirstyCat extends Cat {
Cat(int amount, Animal next) {
super(amount, next);
}

@Override
public void drinkWater(int n) {
amount += n;
if (amount < 0) amount = 0;
if (next != null) next.drinkWater(n);
}
}

关于java - 如何修改包外预定义的包方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793462/

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