2017-08-12 57 views
1

我被困在一个问题。 我的问题是这样的。 我有一个超类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类。
很遗憾,我不得不用我提到的替代方法来解决这个问题。

+0

为什么你在父母___和子类中有'flyable'字段?重复应该是什么意思? – Tom

+0

在超类中调用Flyable接口的方法。并在子类中初始化flyable。你认为这是错误的做法吗? –

+0

是的,那是错的。如果您需要父类中的字段,则将初始化传递给该类(例如'super(new CantFly());')。 – Tom

回答

7

Human继承自Animal,所以它的所有字段都从Animal隐式“复制”。因此,您不需要在HumanBird中重新声明flyable

但你做到了。这导致子类中新的flyable字段的隐藏原始字段在Animal中声明。因此,当你做:

flyable = new CantFly(); 
Human

,您在Human分配一个值flyable,而不是在Animalflyable

然后你这样做:

Animal me = new Human(); 
me.fly(); 

flyAnimal使用在Animal类,尚未分配的声明的字段flyable(你只分配flyableHuman)!结果发生NPE。

要解决此问题,只需删除Animal的子类中的所有flyable字段。这种方式只有一个flyable字段。

我觉得这个设计有点怪。 Human不能飞,所以它不应该有一个flyable字段。实际上,没有任何字段应该有flyable。在这三类中,只有Bird应该执行Flyable

+0

lemme试一试代码曼。我会回到你身边。 –

+0

即使超类不应该有Flyable接口你建议? –

+0

@RohitSingh动物不应该实施“可飞翔”,因为不是所有的动物都可以飞行。 – Sweeper