【问题标题】:Can't declare an abstract method private不能将抽象方法声明为私有
【发布时间】:2011-02-21 21:26:33
【问题描述】:

我想这样做,但我做不到。这是我的情景和理性。我有一个用于测试用例的抽象类,它有一个名为 test() 的抽象方法。 test() 方法由子类定义;它是用特定应用程序的逻辑来实现的,例如CRMAppTestCase extends CompanyTestCase。我不希望直接调用 test() 方法,我希望超类调用 test() 方法,而子类可以调用调用它的方法(并且也可以做其他工作,例如设置当前例如,在执行测试之前的日期时间)。示例代码:

public abstract class CompanyTestCase {
    //I wish this would compile, but it cannot be declared private
    private abstract void test();

    public TestCaseResult performTest() {
        //do some work which must be done and should be invoked whenever 
        //this method is called (it would be improper to expect the caller
        // to perform initialization)
       TestCaseResult result = new TestCaseResult();
       result.setBeginTime(new Date());
       long time = System.currentTimeMillis();
       test(); //invoke test logic
       result.setDuration(System.currentTimeMillis() - time);
       return result;
    }
}

然后扩展这个....

public class CRMAppTestCase extends CompanyTestCase {

    public void test() {
        //test logic here
    }

}

那就叫它....

TestCaseResult result = new CRMAppTestCase().performTest();

【问题讨论】:

  • 附带说明一下,CRMAppTestCase 实例化的日期/时间和运行它的时间可能非常不同,因为它们可能会被排队或放入线程池中以在将来执行。
  • 您重新发明 JUnit 有什么原因吗?
  • 考虑到 test() 不是一个 junit 方法,它没有重新发明。这确实与硒有关,但这是题外话。

标签: java oop


【解决方案1】:

私有方法不是多态的(你不能继承它们),所以将私有方法抽象化是没有意义的。将方法抽象化意味着您必须在子类中重写和实现它,但是由于您不能重写私有方法,因此也不能将它们抽象化。

您应该使用protected 而不是private

Private 真正意味着对您在其中定义方法的类而言是私有的;甚至子类也看不到私有方法。

【讨论】:

    【解决方案2】:

    我想指出的是,Java 的选择是不让抽象私有方法实现(例如,在 C++ 中你可以and is advisable)。说私有方法通常不是多态的只是不知道调用和定义方法是两种不同的机制这一事实——尽管子类永远不能调用超类的私有方法,但它们可以定义它。将两者混为一谈是一种常见的误解,请注意。

    我没有足够的声誉来发表评论,这就是我写答案的原因。

    【讨论】:

      【解决方案3】:

      我想这样做,但我做不到

      改变这一点需要重写编译器,这不太可能。

      您知道为什么这永远行不通,对吧?子类不能覆盖私有方法,但是,它是抽象的,它说它们必须。第 22 条军规。

      【讨论】:

        【解决方案4】:

        您不能拥有private abstract 方法,因为子类看不到超类的私有成员。您需要将您的test 方法设为protected

        【讨论】:

          【解决方案5】:

          abstract 意味着您需要在子类中定义方法

          private 表示子类不会看到该方法

          怎么编译?

          如果该方法最终应该是公共的,则将其声明为公共抽象,仅此而已。

          【讨论】:

            【解决方案6】:

            您应该将“测试”方法声明为“受保护”以实现目标。但它仍然可以从类的包中访问。

            【讨论】:

              猜你喜欢
              • 2017-04-17
              • 2011-05-13
              • 1970-01-01
              • 2012-07-23
              • 2019-07-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多