2011-01-05 13 views
3

現在、いくつかの抽象クラスを含むソリューションを作成しています。これらのうちの1つは、他のいくつかのクラスからのみ拡張する必要があります。これは、意図した以外の場所から使用すると少し混乱を招く可能性があります。だから私がしたいのは、このクラスを拡張できるクラスを制限することです。他のクラスを拡張できるクラスを制限する

もし私がAbstractクラスのImportantStuffという名前を持っているのであれば、クラスAとクラスBだけが他のクラスではそれを拡張できないと言いたいと思います。

私はこのようなことをしたいと思うかもしれません。コードは作業のために書かれているので、他の多くのプログラマーが後でそれを扱うことになるので、このクラスはすでに使用されている場所以外の場所から使用することは意図していません。はい、私はクラスの記述でそれを書くことができ、私は持っているが、私はすべてのプログラマーがコメントを読んで良いとは限らないので、それをブロックすることで100%明確にしたい:)また、私はちょっと興味がある私はウェブ上で良い答えを見つけることができなかったように良いファッション。

私の質問は:とは何ですか?これを実現させる方法は?私は、コンストラクタで処理されるキーまたは何かを送ることができると思いますが、これを行うためのよりクリーンな方法がありますか?

+0

制限の必要どのクラス幾分程度別のクラスをしてもよいです[Open/Closed Principle](https://secure.wikimedia.org/wikipedia/en/wiki/Open/closed_principle)に違反しています。新しいクラスを抽象クラスの範囲まで拡張できるようにするには、抽象クラスと新しいクラスに触れなければなりません。それはあまり保守できません。また、\t 私は興味があります。どんな混乱が予想されますか?これは、アプリケーションの設計上の欠陥の周りにコーディングするように思えます。 – Gordon

+0

@ Gordonあなたは良い点を持っています、そのようなクラスをロックするのは悪い習慣かもしれません。 「混乱を招く」という言葉は最良の選択肢ではないかもしれませんが、後で書かれたアプリケーションでコアのために意図された機能が「誤用される」ことは望ましくありません。私は、コアのみを対象としたリソースとアプリケーションを構築するために使用できるリソースとの間の分離を維持しようとしています。しかし、再びそれを阻止することが最善の方法かもしれません。たぶん私は誰もがドキュメントを読むことを信頼する必要があります:) – Sondre

答えて

4

なるほど、コンストラクタ最終を作る(ただし、init関数を追加)し、現在constrcutedされたクラスがチェックはpossbilieのthatsが、少なくともPHP 5.3

abstract class bigOne{ 
     private $_allowedClasses = array('smallOne'); 

     final public function __construct() { 
      if(!in_array(get_called_class(), $this->_allowedClasses)){ 
       throw new Exception('can not extend to Class: ' . get_called_class()); 
      } 
      $this->init(); 
     } 

     abstract public function init(); 
    } 

    class smallOne extends bigOne{ 
     public function init(){ 

     } 
    } 

    class badOne extends bigOne{ 
     public function init(){ 

     } 
    } 

    $oSmallOne = new smallOne(); 
    $obadOne = new badOne(); 
+0

これはすばらしい、ありがとう:)唯一のメモは彼の答えで、セックスプロルートの点のようであるそれはPHP 5.3+のためだけである – Sondre

+0

ええ、申し訳ありませんそれを言いたいことを忘れてしまった私たちはそれを使用し始める時)とそれ以外の場合(それにいくつか考えを与えることなく)を行うエレガントな方法を知らないだろう – Hannes

+0

Hehe、私はいつも更新されているように私には問題はないが、誰かが後でPHPの古いバージョンを実行している同じソリューションを使用するでしょう:) – Sondre

1

私はこれが可能だとは思わない。各クラスは他のどのクラスでも拡張できます。

抽象クラスを拡張するクラスを制限したい場合は、ホワイトリストを使用して最終メソッドを作成できます。私はこれが汚いが容認できる解決策だと思う。

プロフェッショナルな開発者であると考えている人たちと協力していることに注意してください。そうであれば、ドキュメントを読むべきです。このようなミスを防ぐのは不可能です。ドキュメントを読んでいない場合は、抽象クラスを開いてクラスをホワイトリストに追加するだけです。結論:これはあなたのコードではなく、同僚の訓練で扱うべきものではありません。

+0

汚れたタラを書くことがここでは最高の解決策ではないかもしれないと指摘しておきます。ストリッカーのガイドラインを持つことがより良い解決策になるかもしれません。お返事ありがとうございます。これに関するすべての意見は良いです。それがどのようにコード化されていてもよいかについては興味がありましたが、もしそれが良い習慣であるかどうか議論することは重要です+1 – Sondre

0

これを達成するためにデータベースを使用できるとします。

は、特定のクラスは拡張可能である場合

はサンプルであってもよい見るためにあなたのコード内でこのデータを使用すると、この

------------------------------------------------------------------- 
Class  |  Extendable class 
------------------------------------------------------------------- 
child 1  |  parent1,parent2,parent3 
--------------------------------------------------------------- 

のような行にそのextendable classclass nameリストを置くだろうこの

$extendableClass = explode(',',$datarow['extendable class']); 
$toextendClass = "parent4"; 
if(in_array($toextendClass,$extendableClass)) { 
    //extend 
} 
else { 
    //dont extend 
} 

することができますlsoは、データベースの代わりにクラス名を格納するためにプレーンファイルまたはxmlを使用するか、またはmultidimensional-arrayに格納すると、これが行われる可能性があります。

+0

しかし、これはあなたが例えばcertanクラスを拡張しないことを制限しません。もし私が "Class Exteds NotExtendableClass exteds Not Exts NotExtendableClass"を実行した後でも、エラー/例外がスローされることはありません。 –

+0

親が拡張可能かどうかをチェックする主な理由は、 'Class Extended extends NotExtendableClass'の仕事... – Starx

3

PHP 5の可能な解決策。3+のみ

class Toto { 
    function __construct() { 
     // list of classes that can extend Toto, including itself obviously: 
     if(!in_array(get_called_class(), array(__CLASS__, 'Foo'))) 
      exit(get_called_class() . " cannot extend " . __CLASS__ . "\n"); 

     echo "Success\n"; 
    } 
} 

class Foo extends Toto {} 
class Bar extends Toto {} 

new Toto; 
new Foo; 
new Bar; 

返す:

成功
成功
バーはトト

NBを拡張することはできません:このコンストラクタはない仕事でない場合上書きされます。

+0

リストが動的である必要がある場合はどうなりますか? – Starx

+0

これをクラスのプロパティにしてください。 – seriousdev

+1

+1良い答えのために – Sondre

関連する問題