如何从另一个类的静态方法获取抽象类的子类的实例?

DVK*_*DVK 5 java static abstract-class subclass instance-variables

我有以下类结构:

  • DataStore类:

    • 家长班PStore: public abstract class PStore ...
    • 扩展它的2个子类:CStore1CStore2
    • 每个子类都是N-glton(对不起,不确定Java术语是什么) - 它只能有N个实例,编号为1..NMax.
    • 每个子类都有以​​下方法来访问该实例:CStore1.getInstance(Id)CStore2.getInstance(Id)
  • 工人班:

    • 家长班: public abstract class PWork...
    • 扩展它的2个子类:CWork1CWork2
  • 现在的情况:

    • CWork1实现用下面的代码访问存储一个内部类:

      protected class fListener implements ActionListener {
              public void actionPerformed(ActionEvent ae) {
                  CStore1.getInstance(Id).someMethod();
                  # NOTE: someMethod() is implemented in CStore2 as well
              }
          }
      
      Run Code Online (Sandbox Code Playgroud)
    • 我需要实现相同的fListenerCWork2

    • 作为一个好一点的软件开发人员,而不是简单地复制/粘贴fListenerCWork1CWork2类,然后改变CStore1CStore2在其代码,我决定像一个白痴将其迁移到一个父类.


  • 我试图做的:

    • PStore被调用中创建一个抽象方法getStoreInstance(int Id):public abstract PStore getStoreInstance(int Id);

    • CStore1as中实现该方法public PStore getStoreInstance(int Id) { return CStore1.getInstance(Id); }

      到现在为止还挺好.它编译了所有3个Store类.

    • 将fListener代码复制PWorkCWork1

    • 显然,编译器抱怨说它对CStore1类及其方法一无所知 getStoreInstance()

    • 现在,我决定简单地调用新创建的getStoreInstance():

      旧代码: CStore1.getInstance(Id).someMethod();

      新代码: PStore.getStoreInstance(Id).someMethod();

  • 编译器投诉:"无法从PStore类型中对非静态方法getStoreInstance(Id)进行静态引用".

  • Eclipse提出的唯一"修复"是使getStoreInstance()方法保持静态,但是THAT也不起作用:

    • 当我static在抽象类的方法声明中添加一个修饰符时:public static abstract PStore getStoreInstance(int Id);- 编译器抱怨"PStore类型中的抽象方法getStoreInstance只能设置一个公开或受保护的可见性修饰符"

    • 当我试图使该方法非抽象时:public static PStore getStoreInstance(int Id);它抱怨该方法需要一个体(非常合理)

    • 当我试图添加一个身体时,它要求我返回PStore对象......但是!!!! 我的抽象类PStore没有构造函数,所以我无法返回PStore对象!


我正确地解决了这个问题吗?

如果没有,我该怎么办呢?

如果我是,那么我如何解决原始投诉 "无法对非静态方法进行静态引用",因为抽象类不允许我将该方法设为静态?

awk*_*ksp 0

编译器是正确的,因为在静态上下文中引用实例方法不起作用。在静态世界中,您正在类级别上工作并处理整个类的属性。如果你尝试调用实例方法,编译器如何知道你要执行实例方法的实例是什么?

制作抽象方法是行不通的,因为抽象方法必须在子类中实现。然而,静态方法不能被重写——只能隐藏。因此,如果static允许使用抽象方法,并且您尝试这样做AbstractClass.staticMethod(),那么运行时将使用什么实现?

你的代码有点难以理解,但这就是我的想法。仅从名称来看,getStoreInstance(int Id)确实应该是静态方法,因为一个实例获取另一个实例没有多大意义;这似乎更像是班级应该做的事情。您可能需要重新考虑如何构建代码...从代码名称来看,您似乎应该有一种类级方法来跟踪类的实例,因此也许可以做类似的事情并实现getInstance()andgetStoreInstance()作为静态方法会是一个开始吗?