繁体   English   中英

用Java在超类方法中创建一个新的子类

[英]Creating a new subclass in superclass method in Java

我有一个抽象超类,其中有我的子类使用的具体方法。 在至少一种方法中,我想返回一个相同类型的新对象。

举一个更好的例子,我有一个带有字段(整数)的A类。 我有扩展了A的类B,并且创建了一个名为classB的类B对象。 classB.someMethod应该将num平方并返回具有该平方值的新B类对象。 我不想更改原始实例。

我已经阅读了一些有关反射的文章,因为这是我搜索期间发现的很多内容。 经常建议使用newInstance()。 我还读过,反思可能是不好的。 是否有更好的方法来处理我要做的事情? 它是针对我为openGL编程而创建的个人类,可以通过多种方式进行操作,但始终尝试尽可能使事情保持简单。 如果需要,我可以详细说明我的课程。

public class A(){
    private int num;

    public A(int num){
        this.num = num;
    }

    public A square(A a){
        temp = a.num * a.num;

        return new class same type as the sublcass(temp);
    }
}

public class B extends A(){
    public B(int num){
        super(num);
    }
}

public static void main(String...args){
    B first = new B(4);

    B second = B.square();
}

使用钩子方法(超类中的抽象方法)来生成子类的实例。

如果要在超类中具有特定的返回类型,则需要一个类型变量,其中包含最特定的类引用。 请记住,这会使您的代码更难以理解。

像这样:

public class A<SUB extends A<SUB>> {
    private int num;

    public A(int num){
        this.num = num;
    }

    public SUB square(){
        int temp = num * num;

        return newInstance(temp);
    }

    protected abstract SUB newInstance(int temp);
}

public class B extends A<B> {
    public B(int num){
        super(num);
    }

    protected B newInstance(int temp)  {
        retunr new B(temp);
   } 
}

public static void main(String...args){
    B first = new B(4);

    B second = first.square();
}

您可以覆盖方法,只要类型可以分配给父方法即可。 您可以在此处查看其定义并使用以下模式将其应用于代码。

public class A {
    private int num;

    public A(int num){
        this.num = num;
    }

    public A square(A a) {
        temp = a.num * a.num;

        return newInstance(temp);
    }
    protected A newInstance(int num) {
      return new A(num);
    }
}

public class B extends A(){
    public B(int num){
        super(num);
    }
    public B square() {
      return (B)super.square();
    }
    protected B newInstance(int num) { // Yes, this is allowed
      return new B(num);
    }
}

public static void main(String...args){
    B first = new B(4);

    B second = B.square();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM