Java 界面设计模式情况
Java Interface Design Pattern Situation
我遇到了一个问题。
我的问题是这样的。
我有一个超级class动物和两个子class人类和鸟类。
我的超级 class Animal 中有一个 fly 方法,它将基于 Flyable 接口为 class Human 和 Bird 提供实现。
我的动物 class 看起来像这样。
public class`Animal{
public Flyable flyable;
public void fly()
{
flyable.fly();
}
}
人类Class看起来像这样
class Human extends Animal {
Flyable flyable;
public Human()
{
flyable = new CantFly();
}
}
鸟class看起来像这样
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");
}
When I call
Animal me = new Human();
me.fly();
它给我 NullPointerException
我在这里缺少什么?
我假设。由于我正在调用 new Human(),它会初始化 superclass Animal 中的 Flyable 接口。我错了吗?
我已经通过改变方法的设计解决了这个问题
fly(Flyable flyable)。所以我不想要那个设计方案。
我记得当我为一个应用程序实现搜索算法时遇到这个问题,该算法将提供结果列表但列表项将有不同
UI,
https 调用不同的结束 URL,
正在解析 JSON、
映射到不同的 POJO classes.
遗憾的是,我不得不用我提到的另一种方法来解决这个问题。
Human
继承自 Animal
,因此其所有字段都隐含地 "copied" 来自 Animal
。因此,您不需要在 Human
和 Bird
.
中再次重新声明 flyable
但你做到了。这会导致子class 中的新flyable
字段隐藏 Animal
中声明的原始字段。因此,当您这样做时:
flyable = new CantFly();
在 Human
中,您正在为 Human
中的 flyable
赋值,而不是 Animal
中的 flyable
。
然后你这样做了:
Animal me = new Human();
me.fly();
Animal
中的fly
使用Animal
class中声明的字段flyable
,尚未赋值(你只赋值了flyable
在 Human
)!结果发生 NPE。
要解决此问题,只需删除 Animal
的子class 中的所有 flyable
字段。这样就只有一个flyable
字段。
备注
我觉得这个设计有点奇怪。 Human
不能飞,所以它不应该真的有 flyable
场。事实上,任何东西都不应该有 flyable
字段。在这3个class中,只有Bird
应该实现Flyable
。
我遇到了一个问题。 我的问题是这样的。 我有一个超级class动物和两个子class人类和鸟类。 我的超级 class Animal 中有一个 fly 方法,它将基于 Flyable 接口为 class Human 和 Bird 提供实现。
我的动物 class 看起来像这样。
public class`Animal{
public Flyable flyable;
public void fly()
{
flyable.fly();
}
}
人类Class看起来像这样
class Human extends Animal {
Flyable flyable;
public Human()
{
flyable = new CantFly();
}
}
鸟class看起来像这样
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");
}
When I call
Animal me = new Human();
me.fly();
它给我 NullPointerException
我在这里缺少什么?
我假设。由于我正在调用 new Human(),它会初始化 superclass Animal 中的 Flyable 接口。我错了吗?
我已经通过改变方法的设计解决了这个问题
fly(Flyable flyable)。所以我不想要那个设计方案。
我记得当我为一个应用程序实现搜索算法时遇到这个问题,该算法将提供结果列表但列表项将有不同
UI,
https 调用不同的结束 URL,
正在解析 JSON、
映射到不同的 POJO classes.
遗憾的是,我不得不用我提到的另一种方法来解决这个问题。
Human
继承自 Animal
,因此其所有字段都隐含地 "copied" 来自 Animal
。因此,您不需要在 Human
和 Bird
.
flyable
但你做到了。这会导致子class 中的新flyable
字段隐藏 Animal
中声明的原始字段。因此,当您这样做时:
flyable = new CantFly();
在 Human
中,您正在为 Human
中的 flyable
赋值,而不是 Animal
中的 flyable
。
然后你这样做了:
Animal me = new Human();
me.fly();
Animal
中的fly
使用Animal
class中声明的字段flyable
,尚未赋值(你只赋值了flyable
在 Human
)!结果发生 NPE。
要解决此问题,只需删除 Animal
的子class 中的所有 flyable
字段。这样就只有一个flyable
字段。
备注
我觉得这个设计有点奇怪。 Human
不能飞,所以它不应该真的有 flyable
场。事实上,任何东西都不应该有 flyable
字段。在这3个class中,只有Bird
应该实现Flyable
。