![](/img/trans.png)
[英]Passing Derived Class to a method which needs to override expecting a base class
[英]Write a method implementation in base class which requires override in subclasses?
在Java ...
我正在創建一個包含方法doAction()的類Foo。 我的要求:
abstract會工作,除了它不允許我為doAction()指定一個函數體。
同時滿足所有要求,故事結束是不可能的。 你必須放棄至少一個條件,並且可能會考慮采用一種完全不同的方法來解決你想要解決的問題。
使用兩種不同的方法。 或者:
abstract class Foo {
// Override this method
abstract void doActionInSubclass();
// You can't override a final method
// And you don't want subclases to override this one
final void doAction () {
// do whatever default-y things you want here
doActionInSubclass();
}
}
或者只是將“required”方法與要強制子類覆蓋的方法完全分開:
abstract class Foo {
abstract void mustOverrideThisInConcreteSubclasses();
final void doAction() {
// default-y things here
}
}
如果為Java中的方法提供默認實現,則不能強制子類再次覆蓋它。 如果可以,請使用不同方法名稱的模板方法模式:
public class Foo{
public abstract void templateMethod();
public final void doAction(){
//default implementation
templateMethod(); // call template method
}
}
在Foo
實現您的方法並使其始終拋出異常,如UnsupportedOperationException
。 這將要求子類覆蓋該方法。
如果所有子類都應該覆蓋它,為什么要提供默認實現?! 因為沒有人會使用它,所以毫無意義。 但是,您可能有一些doAction的代碼,您希望由任何子類和一些您想要覆蓋的代碼執行。 在這種情況下,您可以設計如下:
doAction(){
//put your default code here...
specificAction();
}
abstract specificAction();
這樣,doAction就有了自己的實現,它由一個特定的動作調用結束,而這個調用應該由子類實現
在類Foo
的構造函數中,您可以使用反射 :
class Foo {
public Foo() {
Class c = getClass();
if (!c.equals(Foo.class))
{
// try/catch omitted for brevity
Method m = c.getMethod("methodName", new Class[0]);
if (m.getDeclaringClass().equals(Foo.class))
{
throw new Exception("blah blah blah");
}
}
}
}
這不會產生編譯時錯誤,但由於在構造函數中調用super()
不能用try
包裝,所以任何人都無法創建子類來繞過它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.