gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:19 25 4
gpt4 key购买 nike

我有以下类结构:

  • 数据存储类:

    • 父类:PStore:public abstract class PStore ...
    • 扩展它的 2 个子类:CStore1CStore2
    • 每个子类都是一个 N-glton(抱歉,不确定 Java 术语是什么)- 它只能有 N 个实例,编号为 1..NMax。
    • 每个子类都有以​​下访问该实例的方法:CStore1.getInstance(Id)CStore2.getInstance(Id)
  • worker 类:

    • 父类: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
      }
      }
    • 我需要在 CWork2

      中实现相同的 fListener
    • 作为一名优秀的小软件开发人员,而不是简单地将 fListenerCWork1 复制/粘贴到 CWork2 类,然后更改 CStore1CStore2 的代码,我像个白痴一样决定将它迁移到父类。


  • 我尝试做的事情:

    • PStore 中创建一个名为 getStoreInstance(int Id) 的抽象方法: public abstract PStore getStoreInstance(int Id);

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

      到目前为止,还不错。它编译了所有 3 个 Store 类。

    • 将fListener代码从PWork复制到CWork1

    • 显然,编译器提示它对 CStore1 类及其方法getStoreInstance()

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

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

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

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

  • Eclipse 提出的唯一“修复”是将 getStoreInstance() 方法设为静态,但这也不起作用:

    • 当我向抽象类的方法声明添加 static 修饰符时:public static abstract PStore getStoreInstance(int Id); - 编译器提示说"PStore 类型的抽象方法 getStoreInstance 只能设置可见性修饰符,public 或 protected 之一"

    • 当我尝试使该方法成为非抽象方法时:public static PStore getStoreInstance(int Id); 它提示该方法需要一个主体(非常明智)

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


我是否正确地处理了问题?

如果不是,我应该如何处理?

如果是,那么鉴于抽象类不让我让那个方法静态?

最佳答案

在我看来,您有两个同构的类层次结构(如果我使用的是正确的术语)并且相应的类之间存在关系:

      PStore                   PWork
/ \ / \
/ \ / \
CStore1 CStore2 CWork1 CWork2
^ ^ ^ ^
| | | |
|---------+--------------| |
| |
|---------------------|

但我认为在 Java 中没有内置的方式来表达这种关系。不知何故,你将不得不做一些事情来明确这些关系。 IE。 CWork1 中需要有指向 CStore1 的内容,而 CWork2 中需要有指向 CStore2 的内容,或者将它们关联起来的某种列表或 map 。

可能有一种设计模式可以处理这种结构,但我现在想不出。所以在我的脑海中,这里有几个可能的解决方案(都没有使用反射):

  1. 将您在PWork 中定义的抽象getStoreInstance 方法放在PStore 中。在 CWork1 中,使用调用 CStore1.getInstance 的方法覆盖它,在 CWork2 中也类似。然后,普通的 fListener actionPerformed 代码将调用 getStoreInstance(Id).someMethod(),没有类名,这将在当前 PWork 实例。您仍然会有一些“重复”代码(因为您必须在两个 CWork 类中实现 getStoreInstance),但它会保持在最低限度。

  2. 设置 map 。这可以编译(Java 8),但我还没有测试过:

    class PWork {

    private static Map<Class<? extends PWork>,IntFunction<PStore>> storeMap;
    static {
    storeMap = new HashMap<>();
    storeMap.put(CWork1.class, CStore1::getInstance);
    storeMap.put(CWork2.class, CStore2::getInstance);
    }

    protected PStore getStoreInstance(int Id) {
    return storeMap.get(getClass()).apply(Id);
    }

    protected class fListener implements ActionListener {
    public void actionPerformed(ActionEvent ae) {
    int Id = ???; // I'm assuming Id is computed from ae somehow??
    getStoreInstance(Id).someMethod();
    }
    }

    }

现在 getStoreInstance 在映射中查找,使用当前 PWork 对象的类(CWork1CWork2)作为一个键,以确定要调用哪个 getInstance 静态方法。

关于java - 如何从另一个类的静态方法中获取抽象类的子类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com