- ベストアンサー
フレームワークの拡張について
- フレームワークの拡張について考える際に抽象クラスを継承する方法を検討します。
- 派生クラスを改造する際には、直接フレームワークを書き換えるのではなく、抽象クラスを継承してメソッドを追加する方法が一般的です。
- しかし、抽象クラスを書き換えたい場合は継承では解決できません。そのような場合はどのように対処すればよいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私も質問者さんの意図がイマイチ把握出来ていないのですが、 【1】前回質問に補足していただいた内容はすべて、フレームワーク内のライブラリの継承なんですか? 【2】私の回答で「YourCreatedClass」と記述したのはそのまま、「回答者さんが作成したクラス」って意味で書いていて、「FrameworksClass」と記述したものは「フレームワークのクラス」っていう意味です。 この【2】の前提がもし間違っているなら、私の回答は意味をなしません。 もし、【1】の前提であるということであれば、基本的には「出来ません」。 全部書き換えるしか無いと思います。 しかしながら、ZendFramworkが出力に関わる部分で、本当にそんなに使いづらいものかどうかもわかりませんので、そういう意味で「具体的に」どうしたいのかを教えて欲しいと記述しました。 つまり、 ZendFrameworkの~のクラスを~としたい ということをもしよろしければ教えてください。 そもそも、何らかのメソッドなどで宣言すれば表示が切り替わるのかもしれません。
その他の回答 (3)
- hogehoge78
- ベストアンサー率80% (433/539)
回答が大分遅くなってしまって申し訳ないです。 あー、やっぱりZend_Formでしたか・・・ 使い勝手が悪かったのであまりちゃんと学習していないのですが、 とりあえず、addDecoratorメソッドは、Zend_Form_Decorator_*****クラスを呼んでいるので、 Zend_Form_Decorator_HtmlTagを継承した、 Zend_Form_Decorator_MyHtmlTagとかを作成して $this->addDecorator('MyHtmlTag') とかといった感じで呼び出せばよいのではないでしょうか。 無理にZend_Form_Elementを拡張することもない気がします。 または、Decoratorに頼らず、そのままのInputタグだけを取得することもできたはずなので そういうもので対処してみてはいかがでしょう(バリデータとの組み合わせとかでちょっと面倒くさかった覚えがありますが。) 如何でしょうか。
お礼
ご回答ありがとうございます。 なるほど、使い方によっては対処できそうですね。 ただ限界もありそうなので、どうするかはもう少し自分で考えてみたいと思います。
- hogehoge78
- ベストアンサー率80% (433/539)
いえ、 つまり、通常は、 class YouCreatedClass extends FrameworksClass{ } というものを作成していくわけですよね。 それを、 class YourCreatedBaseClass extends FrameworksClass{ } という継承クラスを作って 質問者さんが今後作成するクラス及び、今まで作ってきたクラス(つまりControllerとかModelとかですよね)を class YourCreatedClass extends YourCreatedBaseClass{ } というように継承を変えればよいのではないでしょうか。 これであればフレームワーク自身の書き換えを行わなくても良くなりそうです。 ということではないのでしょうか。 もうちょっと具体的にどういう働きをするクラスをどのように書き換えたいかが分かれば、また別のやり方もあるかもしれません。
お礼
ご回答ありがとうございます。 次のようなbaseクラスのメソッド(print())を利用する 派生クラスがたくさん存在していて、 class BaseClass { public function print() { print "base function\n"; } } class DerivedClass1 extends BaseClass { public function print() { parent::print(); print "derived1 function\n"; } } class DerivedClass2 extends BaseClass { public function print() { parent::print(); print "derived2 function\n"; } } 例えば、baseクラスのprint()の内容を変更したくて、直接書き換えて class BaseClass { public function print() { print "書き換え\n"; } } のように変更すれば、たくさんある派生クラスのprint()メソッドを変更しなくて済みますよね? でも結局はフレームワークのbaseクラスを直接書き換えることになるわけです・・・ hogehoge78さんのおっしゃってるやり方はいまいち理解できないのですが、 この例(printメソッド)を説明すると、hogehoge78さんのやり方はどんな感じになるのでしょうか?
- hogehoge78
- ベストアンサー率80% (433/539)
フレームワークによってはそこら辺を柔軟に変更できるようなものもあったりするのですが、 例えば、CakePHPだったら、app_controller.phpを作成してやればよかったりとか。 一度フレームワークのマニュアルを読み返してみてはいかがでしょう。 DerivedClass1の派生元を、全部、BaseClassではなくて、MY_BaseClassに修正してやって、BaseClassの継承クラスを作る、ぐらいしか方法はない気がします。
お礼
>DerivedClass1の派生元を、全部、BaseClassではなくて、MY_BaseClassに修正してやって、aseClassの継承クラスを作る、ぐらいしか方法はない気がします。 自分もそうするしかないと思ったのですが、 でもそれだとフレームワークそのものを書き換えて修正しなくちゃいけないですよね・・・ ちなみにZend Frameworkでこのようなことをやろうと思っています。
お礼
ご回答ありがとうございます。 こちらの言いたいことは【1】だと思います。 そうですか、やっぱり無理そうですね。 baseクラスを書き換えたいと思ったら、根本的にその機能の部分は自分で作り直さないと駄目ですね・・・ 例えばですけど、抽象クラスではないですけど、 Zend_Form_ElementクラスのloadDefaultDecorators()メソッド内の $this->addDecorator('ViewHelper') ->addDecorator('Errors') ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) ->addDecorator('HtmlTag', array('tag' => 'dd', 'id' => $this->getName() . '-element')) ->addDecorator('Label', array('tag' => 'dt')); の部分(例えばtagなど)を書き換えたいと思ったのですが、 フレームワーク内にこのZend_Form_Elementクラスを継承している派生クラスがいくつかあるので hogehoge78さんの仰る通り無理なのかなぁと。 このクラスではその部分だけ書き換えたいと思ったので、 ほとんどの部分をコピーしたりして作り直すのは気が引けるというか・・・