2016-12-17 15 views
1

この質問では、現在のデザインと特性を使用するアイデアを示したいと思います。私は、形質の正しい理解と、それを伴わない別のデザインで私の問題を解決できるかどうかを知りたい。したがって、私はいくつかを追加することができますPHPの特性を使用して複数の継承をシミュレートする

abstract class AbstractBasePage extends AbstractPage { /* ... */ } 

:私は以下の持っているために使用されるフレームワークに基づいている私のアプリケーションでは

interface IPage { /* ... */ } 
interface IForm extends IPage { /* ... */ } 
abstract class AbstractPage implements IPage { /* ... */ } 
abstract class AbstractForm extends AbstractPage implements IForm { /* ... */ } 

は私の枠組みの中で私の現在のクラス階層は次のようになりますフレームワークや他のアプリケーションに共通ではない、この特定のアプリケーションのためのすべてのページへのより多くのもの。これは、最初のスニペットに示されているように、ページとフォームに分離するまではうまくいきました。今、私はこのようなものになってしまった:

abstract class AbstractBasePage extends AbstractPage { /* ... */ } 
abstract class AbstractBaseForm extends AbstractForm { /* ... */ } 

のは、何か特別なものがテンプレートで表示されているかどうかを示し、各ページのための変数とフォームがあるべき一つのアプリケーションで仮定しましょう。 AbstractBasePageAbstractBaseFormに同じ変数を導入する必要があります。そうすることで、両方のスニペットを同期させるように強制されますが、これはまったくうまくいきません。

私は変数と関数を両方のクラスに公開する特性をつくることを考えていました。これらの変数は、対応する関数で参照できます。このような特性を使用すると、コードの重複を少なくとも減らすことができます。なぜなら、両方のクラスから呼び出される公にアクセス可能なメソッドを導入することができますが、それ以外には適切な抽象化があるからです。

これはどのような特性が役立つと思われますか?より適切なアプローチがありますか?

答えて

1

この特別なケースでは、私は、IPageによって拡張される契約として(フレームワークによって使用される関数を持つ)インターフェイスを導入しました。さらに、フレームワーククラスAbstractPageAbstractFormで順番に使用されていた特性のページとフォームと同じ特定の実装がありました。

上記の実装は、フレームワーク自体の内部にあり、簡潔な設計をしています。この設計は、私のアプリケーションでも同様に使用されます。アプリケーションのために、私は、両方のページとフォームで同じである変数と関数を保持し、AbstractBasePageAbstractBaseFormクラスで使用される特性を導入しました。

このシナリオでは、継承を使用して簡単に行うことはできないが、別のクラスの一部であるクラスに導入できるものを追加したいので、基本的には言語によるコピー&ペースト機能が必要でした階層。それゆえ、私は形質を使うことに決めました。

関連する問題