【问题标题】:How should I construct a subclass using an instance of the superclass?我应该如何使用超类的实例构造子类?
【发布时间】:2015-02-11 19:58:20
【问题描述】:

假设我有以下代码

public class SuperClass {
    protected int super_class_value;

    public SuperClass (int value) {
        this.super_class_value = value;
    }
}

public class Subclass extends SuperClass {
    protected int subclass_value;

    public SubClass(int super_class_value, int subclass_value) {
        super(super_class_value);
        this.subclass_value = subclass_value;
    }
}

但是,现在我希望能够将 SuperClass 对象传递给 SubClass 构造函数。我该怎么做?

public SubClass(SuperClass super_class, int subclass_value) {
    //What do I do here?
    this.subclass_value = subclass_value;
}

基本上,我想做这样的事情......

public SubClass(SuperClass super_calss, int subclass_value) {
    super(super_class.super_class_value);
    this.subclass_value = subclass_value;
}

但如果 SuperClass 更复杂,我不想将每个值都添加到 super() 调用中。相反,我想简单地传入一个已经存在的对象,并将其用作超类。

我想这样做......

public SubClass(SuperClass super_class, int subclass_value) {
    super(super_class);
    this.subclass_value = subclass_value;
}

但我不确定这是否允许?


如果我将构造函数添加到 SuperClass 定义中,似乎我可以执行上述操作。但那会是什么样子呢?

public class SuperClass {
    protected int super_class_value;

    public SuperClass (int value) {
        this.super_class_value = value;
    }

    public SuperClass (SuperClass super_class_object) {
        //What is done here?
    }
}

【问题讨论】:

  • 目前您的代码看起来不错...您到底想用super_class 参考做什么??
  • 你不能像super(super_class_value);那样在子类中传递它吗?
  • 为什么要传递超类对象?
  • 当您只有SuperClass 的实例而不是为超类传递int 时,您是否想问如何将int 传递给超调用?跨度>
  • 作为对您当前更新的回复,我想简单地传入一个已经存在的对象,并将其用作超类。这实际上是不可能的.您可以做的是在您的超类中创建一个构造函数,该构造函数使用传入的引用复制自身。

标签: java inheritance subclassing object-construction


【解决方案1】:

您不想为您的超类设置一个copy constructor 吗?

public class SuperClass {
    protected int super_class_value;

    public SuperClass (int value) {
        this.super_class_value = value;
    }
    protected SuperClass (SuperClass super_class) {
        this.super_class_value = super_class.supper_class_value;
    }
}

public class Subclass extends SuperClass {
    protected int subclass_value;

    public SubClass(SuperClass super_class, int subclass_value) {
        super(super_class);
        this.subclass_value = subclass_value;
    }
}

另请参阅此处关于编写复制 ctor 的问题:

Does Java have a default copy constructor (like in C++)?

【讨论】:

  • 是的,但是 super_class 可能相当复杂,我不想手动复制每个值。
  • @Tester101:啊,但你不是!至少,不在子类中。 SubClass 只是传递 super_class 。至于 SuperClass 本身,如果它的构造比较复杂,可以使用constructor chaining
【解决方案2】:

但是,现在我希望能够将 SuperClass 对象传递给 子类构造函数。我该怎么做?

你做得很好

public SubClass(SuperClass super_class, int subclass_value) {
    //What do I do here?
    // Do Whatever you want to do here ,
    this.subclass_value = subclas_value;
}

现在我想您可能正在考虑如何将 Object 从子类传递给 SuperClass,那么这可以通过 Java 中的 super keyword 来完成

  • super() 用于调用直接父类构造函数。

现在要将 Object 传递给 SuperClass ,在您的子类的构造函数中,您的第一行必须是

super(super_class);

现在在你的超类中,你必须有一个构造函数,它接受 Object 本身,否则上面的行会抛出编译时错误

public SuperClass (SuperClass object) {
         // Do whatever you want to do .
          this.anyInstanceVariable=object.thatInstanceVariable;
    }

附: : 我仍然不明白你想用这个实现什么,但无论你提到什么,这都是你实现它的方式


更新

正如您在 cmets 中所说,您不想复制每个单个变量,那么您可以使用 Object class 的克隆方法

这是一个例子,你将如何在你的情况下实现它

class SuperClass implements Cloneable{ // otherwise clone() method will throw CloneNotSupportedException

    int a;
    SuperClass obj=null; // this will point to the copy of the cloned object

    SuperClass(int a){// just to test that cloning is successfull
        this.a=a;
    }
    SuperClass(SuperClass a){
        try{
        this.obj=(SuperClass)a.clone();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        display();
    }
    public void display(){// to Verify that Cloning has been done successfully
        try{
        System.out.println("Hello from cloned Object "+obj.a);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    @Override
    protected Object clone() throws CloneNotSupportedException  { // Overridden Method
        return super.clone();
    }
}

看看这篇关于Object cloning in java的好文章

【讨论】:

  • SuperClass 中构造函数的主体是什么样的? “// Dowhat you want to do.”在哪里,那里有什么?
  • 那里你可以写任何有效的java语句,但我认为你要在那里执行的任务是复制构造函数的工作
  • 假设 SuperClass 更复杂,我不想复制每个变量。有没有办法简单地“复制”整个对象?
  • 我想你想创建一个对象的克隆
  • @Tester101 ,查看更新的部分希望它会对您有所帮助,可能这就是您想要的
【解决方案3】:

查看Decorator Pattern 了解一个众所周知的例子。该页面还包含一个很好的带有 UML 图的 java 示例。

【讨论】:

    【解决方案4】:
    public class SuperClass {
        protected int super_class_value;
    
        public SuperClass (int value) {
            this.super_class_value = value;
        }
    
        Object obj = new Object();
    }
    
    public class Subclass extends SuperClass {
        protected int subclass_value;
    
        private SuperClass superCl = new SuperClass();
    
        public SubClass(int super_class_value, Object obj2 ,int subclass_value) {
            super(super_class_value);
            obj2 = superCl.obj;
            this.subclass_value = subclass_value;
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可以在SuperClass 中添加getter 方法,并在SubClass 构造函数中使用它们。

      public class SuperClass {
          protected int super_class_value;
      
          public SuperClass (int value) {
              this.super_class_value = value;
          }
      
          public int getSuperClassValue(){ return super_class_value;}
      }
      
      public class Subclass extends SuperClass {
          protected int subclass_value;
      
          public SubClass(SuperClass super_class, int subclass_value) {
              super(super_class.getSuperClassValue());
              this.subclass_value = subclass_value;
          }
      }
      

      【讨论】:

      • 我想避免这种情况,因为 super_class 可能非常复杂
      • 您将不得不在某处设置数据,无论是在 SuperClass 内部通过向 SuperClass 添加额外的构造函数,还是在 SubClass 中通过类似于我在此处编写的内容。
      猜你喜欢
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多