クラスを書き換えるための戦略


7

[TL:DR]
はとを持っCore_Class_AていCore_Class_B extends Core_Class_Aます。
両方を書き直して、共通の機能を追加する必要があります。

だから私はこれを作りました: Custom_Class_A extends Core_Class_A
問題は、下からどれを使用するかです(それぞれに賛成と反対)。

  1. Custom_Class_B extends Custom_Class_A
  2. Custom_Class_B extends Core_Class_B

[フルバージョン] レイヤードナビゲーションに新しいフィルターを追加する拡張機能に取り組んでいます:在庫あり/在庫なし(数日で公開されます)。
コード、今のところ大きな問題はない、戦略...私は私の疑問を持っています。
レイヤードナビゲーションセクションで新しいフィルターを追加するために使用できるイベントがないため、2つのブロックを書き換える必要がMage_Catalog_Block_Layer_ViewありましたMage_CatalogSearch_Block_Layer。(誰かがより良いアイデアを持っている場合は、共有してくださいが、これは質問の範囲ではありません)。

Mage_Catalog_Block_Layer_ViewVinaiが間接的に私を思ったように私はそれをしなかった(Vinaiの拡張子のいずれかについて、このレビューを参照)。
書き換えたいメソッドを追加し、parent::methodName()誰もが監視できるイベントを呼び出してディスパッチしました。

メソッドの例を次に示し_initBlocksます。私の新しいメソッドは次のようになります:

protected function _initBlocks()
{
    parent::_initBlocks(); //call the parent method
    //dispatch an event that I can observe and add my logic.
    Mage::dispatchEvent('catalog_layer_view_init_blocks', array('block' => $this));
}

しかし、問題は生じますMage_CatalogSearch_Block_Layer。このブロックは最初のものを拡張しMage_Catalog_Block_Layer_Viewます。

たとえば、_initBlocks上記のようにメソッドを書き直す必要があります。しかし問題はMage_CatalogSearch_Block_Layer、独自の_initBlocks方法がないことです。親クラスからのものを使用しMage_Catalog_Block_Layer_Viewます。
ここで何をしますか?
上記と同じシステムを使用する必要がありますか、それとも新しいクラスに[Namespace]_[Module]_Block_Catalogsearch_Layer、書き換え用に作成した独自のクラスを拡張させてMage_Catalog_Block_Layer_ViewMage_CatalogSearch_Block_Layer


これは、各アプローチの長所と短所を述べる場合、意見に基づくものではありません。
マリウス

特性は
IMHOの

@philwinkle。私は同意しますが、あなたの邪悪な計画には一つの欠陥があります。以下の回答についてFlyingmanaに説明したように、これはPHP 5.3でも機能する必要があります。
マリウス

回答:


12

この非常に基本的なクラス継承図の問題(ちなみに、描画がおかしいのは残念です)を調べた後、あなたが取った方法と作成した方法を続行する方がよいと私は言いますCustom_Class_B extends Core_Class_B

継承

この図面に関してはCore_Class_B、バージョン1(V1)の拡張機能を見逃してしまい、この機能をコアからコピーする必要があることは明らかです。これは良いアプローチではありません。

この場合、V2はより透過的です。


3
素晴らしい答えと描画のための+1は、それを販売するのに役立ちます:)
philwinkle 2014年

5

最初に、他に選択肢がある場合は、別のクラスのメソッドをコピーする必要があるアプローチを選択しないでください。それらが変更されるとすぐに、更新の問題と作業のログが表示されます。

それらを拡張し、独自のメソッドを再度実装することをお勧めします。明らかに、ここに再度コピーするべきではありません。ここでコードの重複を回避するには、オブザーバーを使用するのが良い方法です。もう1つは、クラス間でコードを共有できるPHPトレイト機能の使用です。


残念ながら、これはphp 5.3でも機能するはずなので、トレイトは使用できません。また、私の場合、いくつかのコードを複製する必要があります。最初のクラスを書き換えるときに、コアクラスからコードを複製するか、手順1で作成したコードから複製します。しかし、私はあなたの意味がわかります。コアからコードを複製するべきではないと思います。自分で制御できるので、自分のコードの方が優れています。ありがとう。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.