簡體   English   中英

在基類中編寫一個方法實現,需要在子類中重寫?

[英]Write a method implementation in base class which requires override in subclasses?

在Java ...

我正在創建一個包含方法doAction()的類Foo。 我的要求:

  1. doAction()必須在Foo中有一個默認實現(即函數體)。
  2. Foo的所有子類都必須覆蓋doAction(),這意味着如果子類不提供新的實現,則會遇到編譯器錯誤。
  3. 我需要能夠實例化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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM