Java界面设计模式情况
我被困在一个问题。 我的问题是这样的。 我有一个超类Animal和两个子类Human和Bird。 我在我的超级动物中有一个飞行方法,它将为基于可飞行接口的人类和鸟类提供实现。Java界面设计模式情况
我的动物类看起来像这样。
public class`Animal{
public Flyable flyable;
public void fly()
{
flyable.fly();
}
}
人力类看起来像这样
class Human extends Animal {
Flyable flyable;
public Human()
{
flyable = new CantFly();
}
}
鸟类看起来像这样
class Bird extends Animal {
Flyable flyable;
public Bird()
{
flyable = new FlyHigh();
}
}
接口都在下面
public interface Flyable {
public void fly();
}
public class CantFly implements Flyable{
@Override
public void fly()
{
Sysout("cant fly");
}
当我打电话
Animal me = new Human();
me.fly();
它给我的NullPointerException
什么我米在这里失踪?
我假设。由于我正在调用新的Human(),它会在超类Animal中初始化Flyable接口。我错了吗?
我已经通过改变方法的设计解决了这个问题。
fly(Flyable flyable)。所以我不想那个设计解决方案。 我记得当面向我实现了一个应用程序的https打电话给其他结束的URL的搜索算法,将提供结果,但列表项的列表将有不同的
UI,
,
解析JSON这个问题,
映射到不同的POJO类。
很遗憾,我不得不用我提到的替代方法来解决这个问题。
Human
继承自Animal
,所以它的所有字段都从Animal
隐式“复制”。因此,您不需要在Human
和Bird
中重新声明flyable
。
但你做到了。这导致子类中新的flyable
字段的隐藏原始字段在Animal
中声明。因此,当你做:
flyable = new CantFly();
在
Human
,您在Human
分配一个值flyable
,而不是在Animal
的flyable
。
然后你这样做:
Animal me = new Human();
me.fly();
fly
在Animal
使用在Animal
类,尚未分配的声明的字段flyable
(你只分配flyable
在Human
)!结果发生NPE。
要解决此问题,只需删除Animal
的子类中的所有flyable
字段。这种方式只有一个flyable
字段。
注
我觉得这个设计有点怪。 Human
不能飞,所以它不应该有一个flyable
字段。实际上,没有任何字段应该有flyable
。在这三类中,只有Bird
应该执行Flyable
。
lemme试一试代码曼。我会回到你身边。 –
即使超类不应该有Flyable接口你建议? –
@RohitSingh动物不应该实施“可飞翔”,因为不是所有的动物都可以飞行。 – Sweeper
为什么你在父母___和子类中有'flyable'字段?重复应该是什么意思? – Tom
在超类中调用Flyable接口的方法。并在子类中初始化flyable。你认为这是错误的做法吗? –
是的,那是错的。如果您需要父类中的字段,则将初始化传递给该类(例如'super(new CantFly());')。 – Tom