• 締切済み

templateメソッドパターンで抽象メソッドを定義する意義

こんにちは。 テンプレートメソッドパターンで、例えば、 class oge { abstract function a(); abstract function b($param); final function tempMethod() { $this->a(); $this->b($param); } } とした場合、抽象メソッドの定義は意味があるのでしょうか? なぜなら、tempMethod()中でa()もb($param)も呼び出してますんで、 わざわざ抽象メソッドとして定義しなくてもサブクラスで実装しないとどっちみち動きません。 抽象メソッドの定義の意義を教えてください。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • _chihiro_
  • ベストアンサー率63% (26/41)
回答No.2

No1の補足です。 ogeクラスのtempMethod()メソッドは、finalキーワードがついているのでオーバーライドできませんね^^; サブクラス内から呼び出すのみです。ゴメンなさい。。

  • _chihiro_
  • ベストアンサー率63% (26/41)
回答No.1

> わざわざ抽象メソッドとして定義しなくてもサブクラスで実装しないとどっちみち動きません。 サブクラスで実装されるからです。 templateメソッドパターンは、スーパークラスで元となるメソッドを定義し、そのサブクラスで具体的な実装をします。 スーパークラスでのメソッドは抽象メソッドだったり、またはサブクラスでオーバーライドされます。 質問者さんの例にあるogeクラスの場合、 サブクラス内でtemplMethod()を呼び出した(オーバーライドした)ときに、必ずメソッドa()とメソッドb()が呼び出され、メソッドa()とメソッドb()はそれぞれのサブクラスで自由に実装してください。という流れになると思います。 ※実装方法は様々ありますので、例えばの話ですが、、 実際にogeクラスを継承したサブクラスSubClassAとSubClassBを2つ作成してみて、両方でtempMethod()をオーバーライドしたものを書いてみればもう少し理解できると思います。

関連するQ&A

  • 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

    • ベストアンサー
    • Java
  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP
  • 抽象メソッド、抽象クラス

    C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。

  • abstractメソッドの使い方

     漠然とした質問になりますが、よろしくお願いします。 今、前の人が記述したソースを読んでおりまして、 抽象クラスのメソッドの使い方で疑問が生じました。 lookメソッドに注目して頂きたいのですが、 public abstract class Editor { protected abstract boolean look() throws Exception; ・・・・・・・・・・・・ if(! this.look()) {   // ★ return false; } という記述があります。Editor クラスにはこの2つ以外のlookメソッドはありません。 そのためlook()では他のクラスで実装した戻り値が返ってくるはずですが、 thisを監視してデバックすると★の行上に処理のラインが来たとき、 thisにlookメソッドを含まないクラス名が表示されます。 thisがEditor でない事自体よく分かりません・・ abstractはあまり使ったことが無く、どこで実装されているのか(正確には、実装されているクラスのうちここで使われているのはどのクラスのlookメソッドか)を知りたいです。 知っている限りの方法では特定できませんでした。 よろしければアドバイスをお願いします。

    • ベストアンサー
    • Java
  • オブジェクトとメソッドの、定義の分離

    JavaScriptにて、最初にメソッド用の関数を定義しておいた後、それを複数のオブジェクトのメソッドとして利用するようにしたいのですがうまくいきません。 *************************** <html> <head> <title>test</title> <script type="text/javascript"> function a() {return this.size;} function b(s) {this.size = s;} function rectA() { this.size = 0; this.getSize = a; this.setSize = b; this.notice = function() {alert(this.getSize());} } function rectB() { this.size = 0; this.arg = 90; this.getSize = a; this.setSize = b; this.notice = function() {alert(this.getSize());} } </script> </head> <body> <script type="text/javascript"> var a = new rectA; var b = new rectB; a.setSize(12); b.setSize(250); a.notice(); b.notice(); </script> </body> </html> ************************* 要するに↑のコードのようなことをやりたいのですが、FireFox3.6と12.1で実行した限りでは、a.notice()は実行されるものの, b.notice()の段階では「this.getSize is not a function」というエラーが出てしまいます。 上手な解決法がありましたらお願いします。

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • テンプレートクラス内のテンプレートクラス(インナークラス)のメソッドを実装ファイルで定義したい

    現在、ヘッダファイル内で下記のようなクラスを宣言・定義しています。 // test.h template < typename T1 > struct A {   template < typename T2 > struct B   {     B( A const& arg ) { ... }   }; }; テンプレートクラスが入れ子になっていて、Bのコンストラクタが引数としてAを取っています。 しかし現状ではコンパイルがとんでもなく遅くなってしまうので、 Bのコンストラクタは宣言のみとし、別途実装ファイル(test.cpp)に定義を書きたいと思っています。 ところがメソッドのシグネチャをどう書けばよいのか分からなくなってしまいました。 苦し紛れに // test.cpp template < typename T1, typename T2 > A<T1>::B<T2>::B( A<T1> const& arg ) { ... } などと書いてみましたが、違うようです。 解決方法はありますでしょうか? 環境はVC7.1かVC8でコンパイルできればよいです。 よろしくお願いいたします。

  • 抽象クラスとインターフェースの使い分け

    抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。

  • アブストラクトとインターフェースの簡単な一例文

    JAVAについて質問よろしくお願いします。 abstract抽象クラスとインターフェースについて下記理解なのですが、超かんたんな一例など欲しいのですが何かないでしょうか。たとえば package round1.chapter1; public class Helloworld { public static void main(String[] args) { System.out.println("こんにちは!"); } } というような一文です。 ~私の理解~ アブストラクトとは、違ったクラス内で同一メソッドがある場合は親クラスに置き、違ったメソッドがある場合は抽象クラスとして親クラスに置いて、実装はサブクラスに任せるという形式で使われる言葉 インターフェースとは、機能だけを仕様書として書いておき、定義されたとおりのメソッドを実装しないといけないという呼び出し方の統一を図る際に使われるメソッド置き場 ~~~~~ このふたつについてものすごく簡単な使用例を頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java