0

派生クラスで定義されるメソッドを基本クラスで使用することは良い習慣ですか? 例えば:

abstract class CApplication {
    use TSingleton;

    protected final function singletonInstanceInit() {
        if (php_sapi_name() == 'cli') {
            $this->initCLIApp();
    }
        else {
            $this->initWebApp();
        }
    }
}

abstract class CWebApplication extends CApplication {   
      protected function initWebApp() { }
}

abstract class CCLIApplication extends CApplication {
    protected function initCLIApp() { }
}
4

2 に答える 2

0

私の知る限り、これは良い習慣ではありません。

継承は、新しい動作と新しい特殊なタイプのオブジェクトを定義するために必要です。つまり、/*should* 今すぐ基本クラスを作成し、後でそれを拡張することができます。

基本クラスがその派生クラスの構造について何らかのコントラクトを知っている場合、派生クラスはその基本クラスを操作するためにいくつかの関数を実装する必要があります。この場合、「コントラクトによる設計」が思い浮かびます。

派生クラスに特定の関数が必要な場合はabstract、基本クラスの関数として、またはクラスが実装するインターフェイスのメソッドとして宣言する必要があります。

そうすれば、基本クラスが派生クラスで実装されたメソッドについて知ることは不合理ではありません。

また、AFAIK の他のより厳密な言語では、コンパイラ レベルでこれが許可されません。c++基本クラスまたはJavaインターフェイスで抽象関数を使用して、上記の行に沿ってこれを実現するには、リファクタリングを行う必要があります。

于 2012-07-24T13:28:37.630 に答える
0

あなたが話しているのは、2つの異なる考え方です。ruby 開発者がミックスインを使用していたためにそのようなことをしているのを見てきました (はい、多くの gem がそうしています)。一方、古典的な Java プログラマーに行って尋ねても、彼はそうすることを勧めません。コードで示している自由のタイプは、動的型付き言語のみが提供するものです (私が CGLib を使用したと言ってうなずく人もいるでしょう)。まったく使用されます。

簡単に言えば、私があなただったら、シナリオを調べて、与えられたタスクにそのような黒魔術が必要かどうかを判断しますか? コードの品質を損なわない限り、悪いルールはありません。

于 2012-07-24T13:55:28.657 に答える