假设你有一个基类,动物.这个Animal类有各种抽象的和可重写的方法.

您有一个子类Cow,它扩展了Animal.此类实现并重写某些方法.

您还有另一个子类Pig,它扩展了Animal.这个类以不同的方式实现和覆盖一些方法.

最后,还有宠物这门课.这个Pet类需要重写Animal类中的某些方法,而保留用于Cow和Pig的AI方法等不变.

作为约束,我不能更改Alter the Cow and Pig类.但是,它基本上会表现得像牛和猪是宠物的子类,宠物是动物的子类.

以下是我所想的一个例子:

public abstract class Animal {
  public abstract void eat();
  public abstract void ai();
  public abstract void die();
  public abstract void dropLoot();
}

public class Cow {
  @Override
  public void eat(){//foo}
  @Override
  public void ai(){//bar}
  @Override
  public void die(){//fig}
  @Override
  public void dropLoot(){//this would run normally}
  public void moo(){
    //Method for Reason
  }
}

public class Pig {
  //Same thing here
}

public class Pet<T extends Animal> extends T //Just visual. This doesn't work {
  @Override
  public void die(){
    //extra logic
    base.die(); //Returns up to the cow or pig instance
  }
  @Override
  public void dropLoot(){//this runs instead of whatever is in Cow or Pig classes}
  
  //I can only override methods that exist in Animal class, so Cow.moo is out of reach
}

至少,这是我的 idea .或者,Pet可以是一个包装器,以某种方式将所需的方法重定向到其他方法.

public class Pet {
  Animal animal;

  @Override(animal.dropLoot()) //Hypothetical implementation that doesn't currently work
  public void HandleDropLoot(){
    //This runs instead of animal.dropLoot, acting as an override.
  }
}

问题是,我不能更改Cow或Pig,所以我只能添加到代码中.这两种方法都适用于我的情况.

我试着找到一种简单的方法来使用(?扩展Animal),但这引发了编译器错误.

我try 使用泛型,但也不起作用.(即Pet扩展T)

我try 了将Animal作为具有包装的变量的 idea ,但我仍然存在覆盖或重定向Animal类中的方法的问题.

推荐答案

或者,Pet可以是一个包装器,以某种方式将所需的方法重定向到其他方法.

这闻起来像是Decorator Pattern人的工作.这个 idea 是Pet类既是is又是has是动物,所以它可以用作Animal,但在需要时可以委托给包装的类.

public class Pet extends Animal {
    private final Animal mDecoratedAnimal;

    public Pet(Animal animalToDecorate) {
        mDecoratedAnimal = animalToDecorate;
    }

    @Override
    public void ai() { mDecoratedAnimal.ai() } // Just delegate

    @Override void die() {
        // Extra logic
        mDecoratedAnimal.die();
    }

    @Override
    public void dropLoot(){
        // This runs instead of whatever is in Cow or Pig classes}
    }
}
    

然后,当您需要使用它时:

Animal cow = new Cow();
Animal pig = new Pig();
Animal petCow = new Pet(cow);
Animal petPig = new Pet(pig);

// Use petCow and petPig like any other animal:
petCow.ai() // Does Cow AI
petPig.ai() // Does Pig AI
petCow.dropLoot() // Does custom pet loot dropping
petPig.dropLoot() // Does custom pet loot dropping
petCow.die() // Does pet stuff then cow dies
petPig.die() // Does pet stuff then pig dies

Java相关问答推荐

在正确位置绘制多边形的PFA问题

android Document File. isDirector()返回意外结果

验证使用GCP生成的非对称密钥时签名不起作用

如何使用Java API在Oracle ODI中运行模拟?

CAMEL 4中的SAXParseException

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

JVM会优化这个数学运算吗?

对某一Hyroby控制器禁用@cacheable

AssertJ Java:多条件断言

Jolt变换JSON数组问题

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

声明带有泛型的函数以用作查找映射中的值

为什么Collectors.toList()不能保证易变性

Android Java:已设置但未读取SharedPreferences

如何在Jooq中获取临时表列引用?

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

基于距离的APACHE POI公式判断

如何使用stream.allMatch()为空流返回false?

Java泛型方法重载