声明抽象方法 java_关于java:不能声明私有的抽象方法

我想这样做,但我做不到。这里是我的场景和理性。我有一个测试用例的抽象类,它有一个名为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();

只是一个旁注,crmaptestcase被实例化的日期/时间和它运行的时间可能非常不同,因为它们可以排队或放入线程池中,以便将来执行。

你为什么要重新发明JUnit?

考虑到test()不是JUnit方法,它并没有进行重新设计。这真的与硒有关,但这是个话题。

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

你应该把它变成protected,而不是private。

private实际上是对您在其中定义方法的类的private;甚至子类也看不到private方法。

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

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

I want to do this, yet I can't

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

你知道为什么这永远行不通,对吧?子类不能重写私有方法,但它是抽象的,说明它们必须这样做。第二十二条军规。

"private"表示方法只能由类调用。因此它必须在类上定义,因此不能是抽象的。如果你想在别处定义这个方法,你必须使它成为私有的以外的东西。

您不能使用private abstract方法,因为子类看不到超类的私有成员。你需要制作你的test方法protected。

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

抽象表示要在子类中定义方法

private表示子类看不到该方法

它如何编译?

如果该方法最终应该是公共的,那么就声明它是公共抽象的,仅此而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值