【问题标题】:Override abstract method with different parameters?用不同的参数覆盖抽象方法?
【发布时间】:2012-06-20 22:16:51
【问题描述】:

我想定义一个抽象方法,以便在我的抽象类中使用这个方法。 然后,我想在扩展我的抽象类的不同类中定义这个抽象方法。

但是我该怎么做呢?

(目标是为集成测试提供一些基本方法,它们都使用相同的“结构”,但实现一些不同的逻辑)。

如何在抽象类中定义一个带参数的抽象方法,在抽象类中已经使用这个抽象方法,但在我的测试实现中首先实现该方法?

public abstract class BaseIT {
    protected doVerify(String params..) {
        if (isValid()) {
            //basic verification for all extending testcases
        }
    }

    protected abstract boolean isValid(Object o);
}


public class TestA_IT extends BaseIT{
    @Test
    public void myTest {
        //do some specific stuff and verify with resulting params

        doVerify(params..);
    }

    protected boolean isValid(Object o) {
        return o.isValid();
    }   
}

请记住,这只是我的问题的一个(愚蠢的)例子。当然,我可以将 isValid 的结果交给基类方法,但在我的具体情况下可能不会这样。

问题是:Object o 是不同测试用例实现的不同对象。

我可能不会为此使用接口。我怎样才能做到这一点?

【问题讨论】:

  • 我看不懂问题。为什么你不能重写你的抽象方法?
  • 就我个人而言,我认为你已经把这个复杂化了。保持测试简单。
  • 而不是展示一些(愚蠢的)示例,它不像你的真实用例,甚至不能编译,你为什么不解释你的真实用例是什么以及你想要实现什么?
  • 你可能会感兴趣:en.wikipedia.org/wiki/Visitor_pattern
  • 我无法理解代码。请举个清楚的例子或解释清楚。

标签: java junit


【解决方案1】:

你可以这样做:

public class TestA_IT extends BaseIT {
    @Test
    public void myTest {
        //do some specific stuff and verify with resulting params

        doVerify(params..);
    }

    protected boolean isValid(Object o) {
        return (o instanceOf YourObject) ? ((YourObject)o).isValid() : false;
    }   
}

实现这一点的一个更酷的方法是实现访问者模式,但我认为你会这样。

【讨论】:

  • 好的,访问者模式真的很酷。很高兴知道。但是对于测试,我认为模板化或强制转换 instanceOf 似乎就足够了。
【解决方案2】:

使isValid 方法接收一个BaseIT 对象并使您的TestA_IT 扩展BaseIT。

【讨论】:

    【解决方案3】:

    您可以定义Template method,然后子类的实现将定义行为。

    【讨论】:

      【解决方案4】:

      你可以直接施放:

      ((Class)o).isValid()
      

      但我认为更好的方法是使用方法isValid() 制作一个接口。并使所有这些对象实现它。

      【讨论】:

        【解决方案5】:

        您的示例令人困惑,因为您显示的两个类没有继承关系。在您澄清这一点之前,您是否考虑过使您的 isValid() 方法成为通用方法和/或采用与 isValid() 方法接口的类型的对象?

        无论如何,请远离涉及强制转换或instanceof 的解决方案。

        【讨论】:

          猜你喜欢
          • 2022-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-20
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多