2016-12-22 3 views
2

Guys抽象クラスメソッドの作業について疑問を晴らしたいだけです。私は満足のいく答えを得ることを願っています。テンプレートメソッドの背後にある論理を理解したい

我々はそうのように定義されたClass Base(抽象クラ​​ス)とClass Derivedを(具象クラス)があります。私たちは

new Derived().operaton_second(); 

と同じようoperation_secondメソッドを呼び出すとき

abstract class Base { 
    abstract public void operation_first(); 

    public void operation_second{ 
     operation_first(); 
    } 
} 

class Derived extends Base { 
    public void operation_first{ 
    //Implementation 
    } 
} 

は、今では常に派生クラスoperation_firstメソッドを呼び出します。 私は、基本クラスが派生クラスメソッドと呼ばれるこのアプローチの背後にあるロジックを知りたいだけです。

+0

あなたがそうwhenverあなたは抽象メソッドを呼び出す。..ので、その呼び出し –

+0

抽象メソッドは、彼らだけが抽象メソッドとして呼ばれてthatsのオーバーライドされる必要がある)(operaitions_second内部operation_first()メソッドを呼び出しています派生クラスのオーバーライドされたメソッドを常に呼び出すでしょう...thats all –

+0

私はoperation_second()メソッドの中でoperation_first()メソッドを呼び出したことを知っていましたが、なぜそれが起こっているのかを知りたいのです。 –

答えて

0

これを「レイトバインディング」といいます。唯一のクラス関数operation_firstが実装されています。派生したものであり、遅いバインディングのおかげでベースクラスはこの実装を知っています。

https://en.wikipedia.org/wiki/Late_binding

0

私は共通のコードを持っているいくつかの(関連)クラスがある。このパターンを使用して参照してください。共通部分を基本クラスに置き、派生クラスの特定のコード、つまりoperation_firstメソッドを配置することができます。基本クラスでは、すべての派生クラスで同じ操作フローを入れる1つのメソッド(これはoperation_secondメソッド)を持つことができます。このようにして、重複したコードを削除し、中央の場所で操作の流れを持たせることができます。

public abstract class AbstractMessageHandler<T extends RequestMessage>() { 
    public ResponseMessage process(T requestMessage) { 
     // some common logic 

     validate(requestMessage); 

     // some more common logic 

     Transaction transaction = getTransaction(requestMessage); 

     // some more common logic 

     ResponseMessage response = processTransaction(transaction, requestMessage); 

     // some more common logic 

     return response; 
    } 

    protected abstract boolean validate(T requestMessage); 

    protected abstract Transaction getTransaction(T requestMessage) 

    protected abstract ResponseMessage processTransaction(Transaction transaction, T requestMessage); 

} 

戦略パターンを使用してプロセスメソッドを呼び出すコードの例です。 EXECUTOR_MAPには、AbstractMessageHandlerのすべての具体的な実装が含まれています。

public ResponseMessage execute(RequestMessage requestMessage) 
     throws MessageHandlerNotFoundException { 

    if (requestMessage == null) {    
     throw new MessageHandlerNotFoundException(
       "Request message is null so no message handler could be found."); 
    } 

    MessageHandler messageHandler = EXECUTOR_MAP.get(requestMessage.getMessageTypeIdentifier()); 
    if (messageHandler == null) {    
     throw new MessageHandlerNotFoundException("No message handler found for message: " 
       + requestMessage.getClass().getName()); 
    } 

    ResponseMessage ctepMessageResponse = messageHandler.process(requestMessage); 
    return ctepMessageResponse; 
} 
+0

どのようにスーパークラスからoperation_firstメソッド呼び出しを行うことができます、私たちは、派生クラスインスタンスでoperation_secondメソッドを呼び出しますが、ここでoperation_firstメソッドがどのように派生クラスオブジェクトの参照を知っているだろう、 –

+0

さて、派生クラスでoperation_secondメソッドを呼び出すと、operation_secondは同じ(派生した)クラスからoperation_firstメソッドを呼び出します。 –

0

異なるタイプ/構造のドキュメントを生成する必要があるとします。

確かに、XMLファイルを生成するために実行しなければならないアルゴリズムはCSVファイルを生成するアルゴリズムと全く異なる、XLSXファイル...この場合

は、テンプレートメソッドの2つのレベルがあります

  • 第1レベルは、生成アルゴリズムが定義されている場所です。
  • 第2レベルは、取り出すデータを指定する場所です。

Automatic Report Generator's Class Diagram

あなたは(ソースコードが入手可能である)、このAPIを試してみることができます。

源:

https://mvnrepository.com/artifact/net.sf.automatic-report-generator(ここで利用可能なソースコード)。

https://sourceforge.net/projects/automatic-report-generator/

関連する問題