2016-05-03 14 views
0

スーパークラスを次のように定義しました。スーパークラスのインスタンスをそのコンストラクタに渡す方が良いでしょうか?

public class superClass{ 

     private superClass superObj; 

     public superClass() { 
     } 
     public superClass(superClass superObj) { 
      this.superObj = superObj; 
     } 

     public start()... 
     public receive().. 

私のサブクラスは次のとおりです。

public class subclass extends superclass { 
@Override 
public receive(){ 
........ 
    } 
public static void main(String args[]){ 
    Superclass superTst = new Superclass(new subclass()); 
    superTst.start(); 
... 
} 

ここで、私のサブクラスは実際にはスーパークラスと "is-a"の関係ではありません。しかし、スーパークラスでは、いくつかの処理出力(スーパークラスは新しいスレッドを生成して処理するので、スーパークラスで出力を得ることができます)をサブクラスでアクセスする必要があるため、このように拡張したいと思います。

これは理論的に正しいですか?

+0

はあなたのサブクラスではない 'superclass'のですか?あなたがしようとしていることを言うのは本当に難しいですが、このデザインは臭いです。 –

+0

* is-a *でない場合は、**型を派生しません。 –

答えて

0

あなたは

サブクラスが実際にはないことを言及したように、「ある-」スーパー

との関係だから私はあなたがCを使用する必要がありますと仮定します下記に示すように、代わりに相続のomposition:

public class superClass{ 

     private subclass subclassObj; 

     public superClass() { 
     } 
     public superClass(subclass subclassObj) { 
      this.subclassObj = subclassObj; 
     } 

     public start(){ 
      //some code 
     } 

     public receive(){ 
      subclassObj.receive(); // call subclass' receive() method 
     } 

そして、あなたのsubclassは次のようになりますどのように

public class subclass { 
public receive(){ 
    //some code 
} 

public static void main(String args[]){ 
    Superclass superTst = new Superclass(new subclass()); 
    superTst.start(); 
    // ... 
} 
} 
+0

ここでは、サブクラスの実装については分かりません。だから、私はスーパークラス内のサブクラスオブジェクトを定義することはできません? – Ratha

+0

あなたは 'サブクラス'を編集することはできませんが、あなたは 'スーパークラス'コードを編集できますか? –

+0

はい...誰でもそのスーパークラスを実装したい(その出力を得るために)それを拡張することができます。 – Ratha

1

私はそうしません。サブクラスがスーパークラスに依存している場合は、依存関係の注入を行います。依存関係が何であるかが明確になり、単一の責任原則が維持されます。そのスーパークラスに耐えることができないものをサブクラス化することは、最終的には紛らわしくなり、実装を緊密に結合していることを意味します。

+0

このパターンをチェックします。 – Ratha

+0

ありがとう、これは私が必要としたものです。 – Ratha

+0

@Rathaこれが答えとしてマークしてくれたら助かりましたか?ありがとう、私が助けることができてうれしい! – bodangly

0

スーパークラスのメソッドをサブクラスから呼び出すことができるはずです。また、サブクラスがインスタンス化されるたびに、スーパークラスのデフォルトコンストラクタが呼び出されます。 superキーワードを使用して別のコンストラクターを呼び出すことができます。

直接質問に答えるには、スーパークラスオブジェクトを使用してサブクラスを構築するのは良い設計ではありません。

0

あなたはスーパークラスで10個のスレッドを作成したいとしましょう:run()メソッド、スーパークラスで最後のインスタンス(サブクラス)で実行するとはなりませんスーパークラス:: execute()メソッドを呼び出し、各スレッド:

abstract class SuperClass { 

    protected abstract function getClass(); 
    protected abstract function exec($thread_id, $data); 

    public function run(){ 
     for($i=0;$i<10;$i++){ 
      // create a new instance of the very top sub class 
      $child_instance = new $this->getClass(); 
      $this->createChildThread($child_instance, $this->someData); 
      // suppose that each thread will call: $child_inst->exec(); 
     } 
    } 
} 

class SubClass extends SuperClass { 
    public function getClass(){ return __CLASS__; } 
    public function exec($thread_id, $data){ 
     // hi...i'm executing inside a thread_id 
     // this instance, is a new instance of class Subclass and 
     // not a SuperClass instance :) 
    } 
} 
+0

これはどの言語ですか?Javaではありません... – Justin

+0

申し訳ありません。この例では – Ratha

+0

問題はありません。あなたは擬似コードを書いていると思います。これはPHPベースの例です。これがPHPコードかJavaコードなら問題ありません。問題を解決しようとしています。どの言語がコーディングされているのですか?私はあなたのニーズをカバーして、言語にではなくロジックを調べようとしています。:) – christian

関連する問題