1

私は、基本クラスを拡張するために透過的な親クラスを広範に使用する Oxid フレームワークを初めて使用します。この技術の利点がわかりません。気になるのですが、これはパターンですか?メリットはどこにありますか?

乾杯、 キャスリン

コード例:

\\ a class by the framework I like to extend
class A { ... }

フレームワークによってこのクラスを拡張する一般的な方法よりも:

class B extend class B_parent

B_parent は、構成ファイルを介してフレームワークによって作成されたクラスで、次のようになります。

'extend'    => array(
        'A'    => 'path_to/B')
4

2 に答える 2

2

これは特定の既知の設計パターンではなく、特に oxid 用に作成された機能です。Oxid のクラスは、「new」ではなく、ファクトリ (oxnew("oxarticle") など) によってインスタンス化されます。oxarticle に登録済みのモジュールが存在しない場合、ファクトリは単に oxarticle のインスタンスを返します。

モジュールが「myOxarticle」を oxarticle の拡張として登録した場合、oxnew("oxarticle") は myOxarticle インスタンスを返し、myOxarticle は oxarticle から拡張されます。このクラス チェーンは、ファクトリによって構築されます。これが最初の利点です。「myOxarticle extends oxarticle」を使用したと想像してください。oxarticle を使用するすべての場所を変更して、オブジェクトが oxarticle の代わりに使用されるようにする必要があります。透明なクラスチェーンにより、ファクトリがこれを処理し、oxarticle オブジェクトが使用されるすべての場所で新しい機能が使用されるようになりました。oxnew("oxarticle") を呼び出す場所は、新しいオブジェクトについて知る必要はありません。

2 番目の利点は、同じ Oxid クラス、さらには同じメソッドを拡張する複数のモジュールがある場合です。ファクトリはバックグラウンドでクラス チェーンを構築し、oxnew("oxarticle") はチェーン内の最後のクラスのインスタンスを返します。クラスを拡張する場合は、すべてのメソッドで親メソッドを呼び出すことをお勧めします。したがって、基本クラスの特定のメソッドが呼び出されると、すべてのモジュール クラスの各メソッドが実行され、各モジュールは他のモジュールについて知る必要はありません。

機能を拡張するもう 1 つの方法は、フックまたはフィルターの使用です。フックの欠点は、拡張可能なすべてのメソッドにフックを組み込む必要があることです。その場合でも、酸化方式の方が柔軟性があります。

クラスメソッドで親メソッドを呼び出せない理由がいくつかある場合があります。たとえば、親メソッドが発生させたくないことを行う場合などです。この場合、これによりモジュール間の独立性が失われるため、他に方法がない場合にのみ実行する必要があります。

既存の動作を変更したくないが、新しいページ コントローラーなど、モジュールのみが使用する独自のクラスを作成したい場合は、メタデータに "files" 配列があり、クラスをこの場合、たとえば、「mycontroller extends mycontroller_parent」ではなく、「mycontroller extends oxubase」を使用します。

于 2016-06-09T14:38:44.260 に答える
2

OXID は、継承チェーンを壊すことなく同じクラスの複数の拡張機能を組み合わせることができるため、この方法でクラス拡張機能を処理します。

たとえば、両方のモジュールがとを使用する場合、同じクラス " start" (ショップ スタート ページ用)を拡張する 2 つのモジュールを取得した場合、それらは からのみ継承され、別の拡張からの追加機能や変更はありません。したがって、両方のモジュールを同時に使用することはできません。class myStart extends startmyOtherStart extends startstart

を使用しclass myStart extends myStart_parentmyOtherStart extends myOtherStart _parentmetadata.php の拡​​張マッピングと組み合わせることで、OXID は同じクラスのすべての変更を 1 つのクラスに動的に結合できます。
1)startは親クラスです
2)myStartに適用されますstart
3)myOtherStartに適用さmyStart
れます この継承チェーンの最後に、すべてのクラス拡張の機能を持つ 1 つのクラスを取得します

乾杯!

于 2016-06-09T08:11:37.097 に答える