我陷入一个问题。
我的问题是这样的。
我有一个超类Animal和两个子类Human和Bird。
我的超类Animal中有一个fly方法,它将基于Flyable Interface为Human和Bird类提供一个实现。

我的动物类看起来像这样。

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

我在这里想念的是什么?
我当时在假设。由于我正在调用new Human(),因此它将在超类Animal中初始化Flyable接口。我错了吗?

我已经通过更改方法的设计解决了这个问题。
fly(Flyable flyable)。因此,我不需要那种设计解决方案。
我记得当我为应用程序实现搜索算法时会遇到此问题,该算法将提供结果列表,但列表项将具有不同的结果
用户界面,
https调用不同的结束URL,
解析JSON,
映射到不同的POJO类。
可悲的是,我不得不用我提到的另一种方法来解决这个问题。

最佳答案

Human继承自Animal,因此其所有字段均从Animal隐式“复制”。因此,您无需在flyableHuman中再次重新声明Bird

但是你做到了。这将导致子类中新的flyable字段隐藏Animal中声明的原始字段。结果,当您这样做时:

flyable = new CantFly();


Human中,您要为flyable中的Human而不是flyable中的Animal分配值。

然后您这样做:

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


fly中的Animal使用在flyable类中声明的字段Animal,该字段尚未分配(您仅在flyable中分配了Human)!结果发生了NPE。

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

注意

我认为这种设计有些奇怪。 Human不能飞行,因此它实际上不应具有flyable字段。实际上,没有任何内容应具有flyable字段。在这3个类中,只有Bird应该实现Flyable

关于java - Java接口(interface)设计模式情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45648691/

10-09 05:55