创建扩展抽象类的子类的实例(Java)

Den*_*cay 4 java oop

在Java中,有没有办法在类A的成员方法中创建扩展抽象类A的任何类的实例?扩展抽象类A的类将使用此方法返回其实例,但我不想在所有子类中使用"return this();"实现相同的方法.亲切的.

编辑:对不起,简短的解释.在我的应用程序中,有一个名为Application的接口,它有一个返回Application类型的getInstance()方法.有一个名为AbstractApplication的抽象类,它是Application接口实现的便利类,但只有接口在其他应用程序中公开.在其他一些应用程序中,将会查找应用程序对象,此查找将返回应用程序类型(接口),而不是特定的实现.现在这是我的问题; 有没有办法在AbstractApplication类中实现getInstance(),所以子类不需要实现这个方法?

Osc*_*Ryz 9

叶氏.这很容易(除非我误解)

你必须使用原型设计模式(或我在这里展示的变体)

当您在运行时之前不知道工厂类可能是什么时,它很有用.与AbstractFactory不同,您可以在其中创建新类型的不同子类,但您可以根据特定条件选择一个.

使用原型,您可以简单地将"原始"对象(原型)注入到您的应用程序中(通过完整的未来依赖注入框架或简单的类名称),然后创建它的新实例.

这是一个示例代码,显示如何使用变体(不使用clone但是newInstance方法)执行此操作

public abstract class Application {
    public Application newInstance() {
        try {
            return this.getClass().newInstance();//this creates an instance of the subclass 
        } catch( InstantiationException ie ){
            throw new RuntimeException( ie );
        } catch( IllegalAccessException iae ){
            throw new RuntimeException( iae );
        }
    }
    public String toString() {
        return "This is the class named: \""+ this.getClass().getSimpleName()+"\"";
    }
} 
// subclasses doesn't repeat the creation part
// they just have to override specific methods. 
class FirstClass extends Application {}
class SecondClass extends Application {}
class ThirdClass extends Application {}
Run Code Online (Sandbox Code Playgroud)

其余代码可以编程到Application界面:

public void doSomethingWith( Application application ) {
        System.out.println( application.toString() );
}
public void startApplication( Application app ) {
    // etc etc 
}
Run Code Online (Sandbox Code Playgroud)

每当您需要新实例时,您只需致电:

Application newApp = original.newInstance();
Run Code Online (Sandbox Code Playgroud)

这将创建正确的类型.

如您所见,子类未指定如何创建新的子类,这些都在基类中.

调用该方法newInstance将始终创建一个相同类型的新实例.


dty*_*dty 6

如果一个超类知道它的子类,这就指出了糟糕的设计.

实现这种目标的常规方法是使用受保护的抽象方法,子类必须实现该方法以返回特定于子类的结果.