我有以下的抽象類:保持抽象方法的知名度在子類中
public abstract class AbstractCreateActionHandler {
protected IWorkItem mCurrentWI;
public AbstractCreateActionHandler(IWorkItem wi) {
this.mCurrentWI = wi;
}
public final void invoke() {
try {
if (checkForLockingFile()) {
this.executeAction();
Configuration.deleteInstance();
}
} catch (IOException e) {
Configuration.deleteInstance();
e.printStackTrace();
}
}
protected abstract void executeAction();
private boolean checkForLockingFile() throws IOException {
String path = Configuration.getInstance().getProperty("path");
File lock = new File(path + "lock_"+mCurrentWI.getId()+"__.tmp");
if(!lock.exists()) {
lock.createNewFile();
return true;
}
return false;
}
}
一個子類繼承了抽象類:
public class MyAction extends AbstractCreateActionHandler {
public MyAction(IWorkItem wi) {
super(wi);
}
@Override
protected void executeAction() {
// Implementation
}
// ALSO POSSIBLE...
/* @Override
public void executeAction() {
// Implementation
}*/
}
問:
是否有可能它擴展了抽象類並實現executeAction()
方法的顯影劑是不允許的變化的的公開程度?
目前開發人員可以簡單地將該方法的可見性更改爲「公開」,創建該子類的對象並調用executeExtion()
。可見性修改器可以改變,抽象方法仍然被接受爲「已實施」。
所以其在抽象類方法invoke()
執行「正常」的調用順序和檢查可以被旁路。有沒有辦法檢查invoke()
方法是否被調用?
好的...我可能已經知道它。所以也沒有辦法檢查是否調用了invoke()方法,對吧?戰略模式看起來不錯。仔細看看。 – sk2212
@ sk2212 - 好吧,有一些令人髮指的方法可以像獲取當前堆棧跟蹤並回顧它,或者維護像「inInvoke」這樣的成員變量,但我不會推薦這些:) – jtahlborn