无法将抽象方法声明为私有

2022-09-01 21:32:47

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

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();

答案 1

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

您应该制作它而不是 .protectedprivate

私有实际上意味着私有于您定义方法的类;甚至子类也看不到私有方法。


答案 2

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

我没有足够的声誉来评论,这就是为什么我要写一个答案。