java - 如何改变一个类的super?

标签 java inheritance

我将在代码示例中解释我的问题。我有一个名为 getNewBaby() 的静态方法(我无法更改)它只返回一个 Animal 类。我需要以某种方式将那只动物变成狗。到目前为止,这是我两次失败的尝试:

public static class Animal
{
    public void eat(){}
}

public static class Dog extends Animal
{
    public Dog(Animal animal)
    {
        super = animal; // <-- error 1
    }
    public void bark(){}
}

.

public static Animal getNewBaby()
{
    return new Animal( /* some future parameters */ );
}

public static void main()
{
    //Attempt number 1:
    Dog puppy1 = (Dog)(getNewBaby());  //  <-- error 2

    //Attempt number 2:
    Dog puppy2 = new Dog(getNewBaby());  //  <-- error 3
}

如何在不更改 getNewBaby() 方法中的任何内容的情况下解决此问题?

最佳答案

你试图做的是不可能的:你不能重新初始化 super

但是还有其他选择(假设您不能修改 getNewBaby):

  • 将您的向下转换包含在 try/catch 语句中并捕获 ClassCastException
  • 使用 instanceof 检查实际类型,是否是 AnimalDogCat 等。并以此为基础
  • 最佳选择Animal 中声明可以在所有子类上重写的方法,从而实现解耦

编辑

这里有几个额外的主题 - 有点偏离/宽泛,但可能对您的设计有帮助。

关于java - 如何改变一个类的super?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274632/

相关文章:

java - 带有复选框和 JFileChooser 的 Swing JTree

java - 在 .war 之外引用 configuration.properties

c++ - 我怎么说 "noexcept if execution of protected base constructor is noexcept"?

c# - 继承与类型转换

java - 当 JSON 对象没有值的键时设置 null

java - XADES4J - 如何将 <ds :Object Id ="xmldsig-1ddcf1ab-7648-4039-b166-69e14da39982-object0". ..> 更改为其他 id

c# - 有类之类的东西可以实现吗?

Java:对象的初始化顺序

java - 如何通过IP与运行API的设备建立连接?

scala - Scala 中重写和继承的辅助构造函数