在不更改其签名的情况下修改父 class 方法的功能(通过子 class)
Modifying functionality of a parent class method (through a child class) without changing its signature
我有三个 class。我想在 Parent class 的 execute
方法中有条件地执行 CodeBlock2,这是基于我在通过 MyChild class 调用此方法时设置的标志。
出于遗留目的,修改 Parent class 中 execute
方法的签名以具有额外的布尔参数是不可能的。
Q1。在CPP中,我曾使用lambda functions来达到类似的效果;根据我的经验,这涉及整个包中的大量代码修改,其中使用了 Parent class 的等价物。鉴于我的更改的重要性和覆盖范围,我会避免这样做。 Java 是否有一些类似或更简单的方法来实现这一目标?
Q2。我认为在 Parent class 中使用带有标志的实例变量也是可能的,也许不那么优雅。有人也可以加入这个解决方案吗?
非常感谢您的意见。有一些相关但不太相似的问题 , 2.
public abstract class Parent extends GrandParent
{
@override
public void execute(String A)
{
// CodeBlock1
// CodeBlock2 // I wanna put this under if condition based on a flag in MyChild
// CodeBlock3
}
}
public class Child extends Parent
{
@override
protected boolean someMethod()
{
// code
}
}
public class MyChild extends GrandParent
{
@override
public boolean execute(String A)
{
String B = "123";
child.execute(B);
// child.execute(B, true); // what I wanna do
}
private Child child;
}
您不能更改 parent 的方法的方法签名 child、
您可以在 parent 中使用访问修饰符 protected
定义 boolean
标志并更改
在 child 中并使用 super.execute(A)
调用 parent 方法
public abstract class Parent extends GrandParent {
protected boolean enableCodeBlock2;
@override
public void execute(String A) {
// CodeBlock1
if (enableCodeBlock2){
// CodeBlock2 // I wanna put this under if condition based on a flag in MyChild
}
// CodeBlock3
}
}
,并在 child
public class Child extends Parent {
@override
public void execute(String A) {
enableCodeBlock2 = true;
super.execute(A);
}
}
如果您可以将 CodeBlock2
提取到 Parent
class 中的单独方法中,下面的方法将起作用:
public abstract class Parent extends GrandParent
{
@Override
public void execute(String A)
{
// CodeBlock1
codeBlock2(); // I wanna put this under if condition based on a flag in MyChild
// CodeBlock3
}
protected void codeBlock2() {
// CodeBlock2
}
}
public class MyChild extends Parent
{
@Override
protected void codeBlock2() {
if(condition) {
super.codeBlock2();
}
}
}
我有三个 class。我想在 Parent class 的 execute
方法中有条件地执行 CodeBlock2,这是基于我在通过 MyChild class 调用此方法时设置的标志。
出于遗留目的,修改 Parent class 中 execute
方法的签名以具有额外的布尔参数是不可能的。
Q1。在CPP中,我曾使用lambda functions来达到类似的效果;根据我的经验,这涉及整个包中的大量代码修改,其中使用了 Parent class 的等价物。鉴于我的更改的重要性和覆盖范围,我会避免这样做。 Java 是否有一些类似或更简单的方法来实现这一目标?
Q2。我认为在 Parent class 中使用带有标志的实例变量也是可能的,也许不那么优雅。有人也可以加入这个解决方案吗?
非常感谢您的意见。有一些相关但不太相似的问题
public abstract class Parent extends GrandParent
{
@override
public void execute(String A)
{
// CodeBlock1
// CodeBlock2 // I wanna put this under if condition based on a flag in MyChild
// CodeBlock3
}
}
public class Child extends Parent
{
@override
protected boolean someMethod()
{
// code
}
}
public class MyChild extends GrandParent
{
@override
public boolean execute(String A)
{
String B = "123";
child.execute(B);
// child.execute(B, true); // what I wanna do
}
private Child child;
}
您不能更改 parent 的方法的方法签名 child、
您可以在 parent 中使用访问修饰符 protected
定义 boolean
标志并更改
在 child 中并使用 super.execute(A)
public abstract class Parent extends GrandParent {
protected boolean enableCodeBlock2;
@override
public void execute(String A) {
// CodeBlock1
if (enableCodeBlock2){
// CodeBlock2 // I wanna put this under if condition based on a flag in MyChild
}
// CodeBlock3
}
}
,并在 child
public class Child extends Parent {
@override
public void execute(String A) {
enableCodeBlock2 = true;
super.execute(A);
}
}
如果您可以将 CodeBlock2
提取到 Parent
class 中的单独方法中,下面的方法将起作用:
public abstract class Parent extends GrandParent
{
@Override
public void execute(String A)
{
// CodeBlock1
codeBlock2(); // I wanna put this under if condition based on a flag in MyChild
// CodeBlock3
}
protected void codeBlock2() {
// CodeBlock2
}
}
public class MyChild extends Parent
{
@Override
protected void codeBlock2() {
if(condition) {
super.codeBlock2();
}
}
}