2

首先,请注意我正试图用我目前的知识和词汇尽可能地表达我的问题,所以请原谅......

我有一个抽象类,我想在其中创建一个实例化自身的方法......当然这在抽象类中是不可能的,但是,我真正想要的是具体的孩子(那些“扩展”的类)继承这个实例化,这样他们就可以实例化自己....

基本上我想做的是:

MyAbstract a = new this();

但是这是不允许的......有什么办法可以做我想做的事吗?

这是一些非编译的梦想代码(即我希望工作的代码)。基本上我希望 ConcreteChild 调用一个方法,在该方法中它创建自己的对象。该方法是从其父级继承的。

public class Abstract {

    public void instantiateMyConcreteChild()
    {
        Abstract a = new this();
    }

}

public class ConcreteChild extends Abstract{

    public static void main(String[] args) {
        ConcreteChild c = new ConcreteChild();

        c.instantiateMyConcreteChild();
    }

}

* 附加信息 **

感谢您的回复,但我想我错过了一些重要的事情......

基本上我想将一个对象的自我(“this”)传递给其他一些类的一些方法。但是,在对象中创建实例化另一个对象有点倒退,我可以传递“this”,对...

4

5 回答 5

2

您可以使用反射来做到这一点,例如:

Abstract a = getClass().newInstance();

这是因为 getClass() 总是返回具体类,所以 this.getClass() 将返回真正的子类而不是当前类。

但是,请注意,如果子类定义了自定义构造函数,其参数比抽象类多或少,它可能会失败。除非您在文档中指定子类必须具有具有此类给定参数的构造函数……但无论如何它都很脆弱。

您可以检查它,使用 getClass().getConstructors() 并查看那里有哪些构造函数,以及是否存在您期望的构造函数,甚至搜索可行的构造函数,否则您可以捕获由 newInstance(.. ),并为用户将其包装在更具描述性的例外中,以便他们更好地理解他们错过的内容......但这仍然是一种黑客行为,因为对于这种情况没有明确的语言支持。

另一种方法可能是在您的抽象类中实现 Cloneable,然后使用 clone 方法,但如果您想要的是一个新的、干净的实例,这可能是矫枉过正甚至是错误的。

于 2011-08-29T16:16:30.987 回答
0

您不能使用实例方法执行此操作。因为顾名思义,实例方法要求实例已经实例化。

于 2011-08-29T16:20:54.080 回答
0

您在这里实际需要做的是将不变的内部功能与抽象类本身分开。所以我可以做的是,例如,有一个真正封装不变功能的内部类,如下所示:

public class Abstract {

   public void instantiateMyConcreteChild()
   {
       Abstract a = new NonChangingOperations();
   }

   class NonChangingOperations
   {
       public void operationA() {}
   }

}

事实上,您真的不需要将类 NonChangingOperations 保留为内部类,您可以将其作为具有自己的类层次结构的外部实用程序类。

于 2011-08-29T16:21:30.043 回答
0

您是否正在尝试定义 Abstract 的子类可以使用的构造函数?如果是这样,您可以像定义任何其他构造函数一样简单地执行此操作。

public class Abstract {

Abstract() {
    //set fields, etc. whatever you need to do
}

}

public class ConcreteChild extends Abstract{

    ConcreteChild() {
        //call superclass's constructor
        super();
    }
}
于 2011-08-29T16:21:44.413 回答
0

你能有这个吗?

public abstract class AbstractClassWithConstructor {


    public AbstractClassWithConstructor() {
        init();
    }

    protected abstract void init();
}

供参考

在objective-c中,您需要通过调用方法init来设置它。方法 init() 看起来像这样:

protected AbstractClassWithConstructor init() {
        return this;
    }
于 2011-08-29T16:29:41.537 回答