Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写方法并使其表现为静态_Java_Oop_Design Patterns - Fatal编程技术网

Java 重写方法并使其表现为静态

Java 重写方法并使其表现为静态,java,oop,design-patterns,Java,Oop,Design Patterns,我有一个现有的框架,我不能更改,它读取2个属性 ClassA=somepackage.animImplementationofInterfaceA ClassB=somepackage.AnImplementationOfInterfaceB 在新类a上调用公共方法a,在新类B上按顺序调用公共方法B 我想让C类实现接口a、B,并为D类提供钩子methodC1、methodC2来覆盖methodA和methodB,其中包含大量样板文件和复杂的实现——methodC1和methodC2将封装业务逻辑

我有一个现有的框架,我不能更改,它读取2个属性

ClassA=somepackage.animImplementationofInterfaceA ClassB=somepackage.AnImplementationOfInterfaceB 在新类a上调用公共方法a,在新类B上按顺序调用公共方法B

我想让C类实现接口a、B,并为D类提供钩子methodC1、methodC2来覆盖methodA和methodB,其中包含大量样板文件和复杂的实现——methodC1和methodC2将封装业务逻辑。那么我的财产将是

ClassA=somepackage.classD ClassB=somepackage.classD 问题是,实现类D的人可能会编写类似以下内容:

class D extends class C
{
   private int foo; //must be non-static due to multi-threaded new Class D() calls going on
   int methodC1() {this.foo = read number from network}
   methodC2(int x) {y = this.foo;} //methodC2 is always called after methodC1

   //methodA, methodB implementation inherited from C
}
但这并不像预期的那样有效,因为框架实际上每次在调用methodA、methodB之前都会创建一个新的D类对象,因此不能依赖于使用this引用

将methodC1、methodC2定义为静态也不起作用,因为这样对methodC1的调用就绑定到C中的实现,而不是D中被重写的实现

真正应该写的是:

class D extends class C
{
   int methodC1() {return number from network;}
   methodC2(int x) {y = x}  //here y is using the return value of methodC1

   //methodA, methodB implementation inherited from C
}
我还希望只有methodC1、methodC2是可重写的,即在D上工作的程序员不能干扰methodA

理想的设计应该是

属性仅引用一个类 方法1,方法2在那个班 挑战摘要

在方法1,方法2中没有这个 无法使methodC1、methodC2处于静态状态 Properties只接受一个可实例化的类
如何设计这个框架?这是可以解决的吗?您可以更改methodC1、methodC2的签名。

组合!建立一个你可以接受的界面


该类将包含Method1和D2的逻辑,对于其他所有内容,只需对当前现有类中的其他方法进行简单调用即可。人们将无法修改调用以更改底层逻辑。

静态方法不能被覆盖


如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法将隐藏超类中的方法。隐藏和重写之间的区别具有重要意义。

不能使静态方法可重写。是的。我的设计问题的关键似乎是限制一个方法使用它,但使其可重写。如果我理解正确,您的意思是:定义包含methodC1、methodC2的类E。C类有一个成员E。那么C会调用e.methodC1和e.methodC2?但问题是如何将e转换成C?当我设置属性时,框架调用new C.methodA,然后调用new C.methodB。