【问题标题】:How do I selectively override functions of a class如何有选择地覆盖类的功能
【发布时间】:2017-07-18 11:42:14
【问题描述】:

我有一个抽象类 A,它包含两个函数,都实现了

public void entry(){}
public void exit(){}

这些是在内部进行的系统调用,我想在某些情况下避免这些调用。我正在编写一个测试(单独的类),我将在其中进行自己的调用,但我不想干扰代码的正常运行。我可以通过哪些方式实现这一目标?

我想到的一种方法是使用这两个函数创建一个接口 B,并在实现该接口并包含实际代码的抽象类中创建一个类 C。在抽象类中,我将有一个函数来设置我想要使用的接口实例化。示例:

public static void setMockProvider(B provider) {
    if (provider != null) {
        mockProvider = provider;
    } else {
        mockProvider = new C();
    }
}

然后无论在哪里调用入口和出口函数,我都会做一个 mockProvider.entry() 和 mockProvider.exit()

【问题讨论】:

  • 使用模拟还是间谍?
  • 为什么不直接使用 A 的子类?

标签: java class interface


【解决方案1】:

我会像你说的那样建议。用这两种方法做一个接口。并在您想要它们的不同实现的地方覆盖它们。

界面

public interface Interface
{
void methodA();
}

A类(抽象类)

public class A : Interface
{


    void methodDescision(T parameter)
    {
        if(parameter != null)
        {
            methodA();

        }else{
            var YourInnerClass YIC = new YourInnerClass();
            YIC.methodA();
        }

    }

    @Override 
    methodA(){
        // do default stuff
    }

public class YourInnerClass
{
    @Override
    methodA(){
         //do user defined stuff
    }
}

}

B类(其他类)

public class B : Interface
{

    @Override 
    void methodA()
    {
        //your new implementation of that method
    }

}

确保在这两个类中实现接口。

希望这会有所帮助。

干杯!

【讨论】:

  • 但是在正常的代码流中调用了 A.methodA() ,我无法更改。我想要的是当调用 A.methodA() 时,它应该检查一些参数并调用默认实现或用户定义的实现
  • 为什么不做另一个方法来带参数呢?在 interface.than 覆盖你的代码。并检查该参数是否为空。如果是。运行您的标准 A.methodA() ,如果它不为空,则执行用户定义的。所以你会有3种方法。一个总是被调用并检查参数的。并轮流执行抽象类 A 中的方法
  • 我编辑了我的代码,它可能会像那样工作,但我不完全确定。你提到你也有一个内部类,所以我把它放进去。你可以在任何实现该接口的类中重写该方法。您所要做的就是在 desider 方法中创建一个实例来访问您的覆盖方法
【解决方案2】:

不太确定我是否完全理解了这个问题,但您想在不干扰方法的基础工作方式的情况下进行自己的调用(我假设它们是被继承的)?

如果是这样,你可以调用 super(),super 将调用你继承的类的方法。

@Override
public void entry() {
  super();
  //Your code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2017-11-17
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多