DVK*_*DVK 5 java static abstract-class subclass instance-variables
我有以下类结构:
DataStore类:
PStore: public abstract class PStore ...CStore1和CStore2CStore1.getInstance(Id)和CStore2.getInstance(Id)工人班:
public abstract class PWork...CWork1和CWork2现在的情况:
类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)我需要实现相同的fListener类CWork2
作为一个好一点的软件开发人员,而不是简单地复制/粘贴fListener从CWork1到CWork2类,然后改变CStore1到CStore2在其代码,我决定像一个白痴将其迁移到一个父类.
我试图做的:
在PStore被调用中创建一个抽象方法getStoreInstance(int Id):public abstract PStore getStoreInstance(int Id);
在CStore1as中实现该方法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()方法保持静态,但是THAT也不起作用:
当我static在抽象类的方法声明中添加一个修饰符时:public static abstract PStore getStoreInstance(int Id);- 编译器抱怨"PStore类型中的抽象方法getStoreInstance只能设置一个公开或受保护的可见性修饰符"
当我试图使该方法非抽象时:public static PStore getStoreInstance(int Id);它抱怨该方法需要一个体(非常合理)
当我试图添加一个身体时,它要求我返回PStore对象......但是!!!! 我的抽象类PStore没有构造函数,所以我无法返回PStore对象!
我正确地解决了这个问题吗?
如果没有,我该怎么办呢?
如果我是,那么我如何解决原始投诉 "无法对非静态方法进行静态引用",因为抽象类不允许我将该方法设为静态?
编译器是正确的,因为在静态上下文中引用实例方法不起作用。在静态世界中,您正在类级别上工作并处理整个类的属性。如果你尝试调用实例方法,编译器如何知道你要执行实例方法的实例是什么?
制作抽象方法是行不通的,因为抽象方法必须在子类中实现。然而,静态方法不能被重写——只能隐藏。因此,如果static允许使用抽象方法,并且您尝试这样做AbstractClass.staticMethod(),那么运行时将使用什么实现?
你的代码有点难以理解,但这就是我的想法。仅从名称来看,getStoreInstance(int Id)确实应该是静态方法,因为一个实例获取另一个实例没有多大意义;这似乎更像是班级应该做的事情。您可能需要重新考虑如何构建代码...从代码名称来看,您似乎应该有一种类级方法来跟踪类的实例,因此也许可以做类似的事情并实现getInstance()andgetStoreInstance()作为静态方法会是一个开始吗?