0

次のようにインスタンス化されたフロントコントローラーがあります。

$request = new FrontController();
$request->route();

メソッドはroute()、要求に基づいて、必要に応じて適切なコントローラーを動的に呼び出します。

今(私は思う)すべてのコントローラーがFrontControllerを拡張して、メソッドとプロパティの共有セットにアクセスできるようにしたいのですがroute()、無限につながる可能性があるため、メソッドを継承したくありませんループ。ただし、メソッドがプライベートとしてマークされている場合はroute()、上記のようにオブジェクトをインスタンス化できません。

私が見つけた唯一の解決策はself::route()、FrontController のコンストラクターから呼び出してから、各子コントローラーで空のコンストラクターを定義することです。ずさんな感じです。

特定のメソッドをプライベートとしてマークせずに継承から除外する方法はありますか? それとも、問題を別の角度から見る必要がありますか?

4

3 に答える 3

2

メソッドの前にfinal修飾子を追加して、サブクラス化によってオーバーライドされないようにすることができます。

class FrontController{
   final public function route() {
       // ...
   }
}

その他の例と詳細な説明については、次のPHPマニュアルエントリを参照してください。

http://php.net/manual/en/language.oop5.final.php

于 2013-01-22T13:07:34.827 に答える
1

それとも、問題を別の角度から見る必要がありますか?

おそらく、そうです。最初に、解決しようとしていることを正確に考える必要があります。なぜなら、そこには実際の問題さえ見当たらないからです。あなたが書いたことから、無限ループのリスクはありません。

于 2013-01-22T13:12:28.393 に答える
1

継承されたアイテムを選択的に「オフ」にできるかどうかを尋ねていますか? 残念ながら、これに対する答えは「いいえ」です。これは基本的に定義によるものです。

2 つの選択肢:

そのようなメソッド(/property)を実装したくない子クラスでは、それをオーバーライドして、ある種の「実装されていない」結果を返すことができます。

可能であれば、一連の基本クラスを階層内に作成し、各建物を最後に作成します。その後、子クラスは基本クラスの 1 つから継承できますが、必ずしもすべての子が同じ基本クラスから継承されるとは限りません。

これらのアプローチはどちらもかなり醜いです。私が若い頃、私はこれらのどれが好ましいかについて意見が分かれていましたが、基本的には 6 と 2 つの 3 であるため、そうするのをずっと諦めていました。どちらかといえば、あなたが書いている実際の環境の規範が何であるかに依存すると思います。

しかし、座って考えてみれば、なぜ継承がこのように実装されるのかがわかるでしょう。

于 2013-01-24T15:36:02.150 に答える