3

私は基本的な Java を学んでいます。Head First Java から基本的な概念を読んでいます (Polymorphisim、抽象クラス/メソッド、オーバーライドなど)。1 つのリモコンが 3 つのデバイスすべてで完全に機能する必要があります。今私がしたことは..

  • リモコンは、これらすべての 3 つのクラスのテレビ、ホーム シアター、CD プレーヤーのスーパー クラスです。
  • on 、 off 、 volume +- 、 channel +- などの基本機能はスーパークラスにあり、これらはオーバーライドされます
  • 一般的ではないメソッドは、Cd プレーヤーの Eject、Insert、TV やシアターの表示設定などのインターフェイスで実装されています。

    それで、このアプローチはOKですか?

1 つのクラスをスーパー クラスとして取り、残りのコードを interfaces に実装します。

もう一点、if one method is common in Tv and theater like Display settings should i implement interface or change my class hierarchy ..

ばかげた質問でも気にしないでください。また、これらの oop デザイン テクニックについても教えてください。ありがとうございます。

4

5 に答える 5

7

Inheritance (SuperClass-SubClass ロジック) を実装する前に、必ずIs-Aテストを実行してください。テレビはリモコンですか?いいえ...あなたのアプローチは間違っています。私によると、それはインターフェースでなければなりません。TV は Remote を拡張せずに実装する必要があります。共通コードがある場合は常に、継承を使用して重複を避けるというわけではありません。

on 、 off 、 volume +- 、 channel +- などの基本機能はリモート インターフェイスにある必要があり、他のすべてのクラス TV n はすべてそれらを実装する必要があります。

public Class TV implements Remote

また、継承を使用したい場合は、 ElectronicGadget のような SupeClass を持つことができます。テレビ、ホーム シアター、CD プレーヤーはすべて電子機器です。次のような一般的なメソッドを持つことができます

public boolean turnOn()
public boolean turnOff()

初期化。

于 2013-05-25T07:10:14.837 に答える
3

TV、HomeTheater、CD プレーヤーは明らかに IS-A リモコンではありません。それらは確かにリモート可能です。インターフェイスが必要でありRemotable、デバイスによって実装されているというヒントが得られます。

interface Remotable {
    void turnOff();
    void turnOn();
    void volumeUp();
    void volumeDown();
    void selftDestruct();
}

次に、すべてのデバイスにこのインターフェイスを実装させます。

class Television implements Remotable {

    @Override
    void turnOff() {
        System.out.println("Television is turned off");
    }

    //implements the rest.
}

class HomeTheater implements Remotable {
    // implements likes Television
}

class CDPlayer implements Remotable {
}

次に、デバイスRemoteを処理するクラスを作成しました。Remotable

class Remote  {
    private Remotable target;

    public Remote(Remotable target) {
        this.target = target;
    }

    public void turnOn() {
        target.turnOn();
    }
}

すべてを組み立てると、次のようになります。

Television tv = new Television();
Remote remote = new Remote(tv);
remote.turnOn();
于 2013-05-25T07:24:01.880 に答える
1

率直に言って、あなたは要点を逃しています。

OOP を正しく使用することではなく、変更についてです。今後さらにデバイスを追加する予定はありますか? または、特定のデバイスの機能が変更されますか?

すべてのデバイスに固有のリモコンを作成する場合、それらのデバイスにはさまざまな種類のリモコンが必要になります。また、各デバイスには複数のリモコンがある場合とない場合があります。したがって、リモート プロパティを継承することはできません。代わりに、そのデバイスに基本的に必要なリモート プロパティを実装する必要があります。リモート自体は、相互に継承する構造のようなツリーになります。リモートは、channelClicker、soundBasic、soundAdvanced、soundProfessional、videoChild などの機能を継承します。

ユニバーサルリモコンを構築している場合、デバイスは変更されます。新しいデバイスを追加するときに、他のデバイスのコードの変更を制御する必要があります。したがって、リモートが機能している間は、デバイスの種類を抽象化する必要があります。リモートは、デバイスごとに異なる動作をします。一部のデバイスでは、リモートが「サポートされていません」というメッセージを表示します。音量は、upPress ごとに 5db 増加するものもあれば、upPress ごとに 50db 増加するものもあります。各デバイスのリモート パラメータは異なります。デシベルの単位、明るさの単位。

異なる考え方をし、変化に備えて設計する必要があります。将来コードを変更する場合、すべてのデバイス、すべてのリモコンを再テストする必要はありません。変更はそのデバイスに対してのみローカライズされるためです。デバイスごとに異なる小さなライブラリを使用できるため、テストを再構築して実行しても、コードを変更していないため、古いテストを実行する必要はありません。

設計パターンは、将来のコードの変更を最小限にすることを念頭に置く必要があります。

編集:そして、良い質問があります。最初の 3 つの章をもう一度読み、さらに多くの水を飲むことをお勧めします。あなたはとても近くにいます。あきらめないでください、あなたの例を変えないでください、あなたがそれを得るまであきらめないでください. 私を信じてください、あなたはとても近いです。

于 2013-05-25T07:58:58.283 に答える
1

あなたがリモートがスーパークラスであることを意味するとき、私が理解していることから、それはすべてのリモートタイプ(テレビ、CDプレーヤーなど)用です

ガジェットごとにリモートの動作が変わります。おそらくRemoteControl、一連のメソッドを持つインターフェイスも同様です。すべての実装クラスには、独自のフレーバーがあります。

注: より意味のあるクラス/インターフェイス名を追加することをお勧めします。JDKのRemote意味でもあるので、私は好まないjava.rmi.Remote

もう 1 つ: すべてのサブクラスで再利用可能であると思われる場合、またはスーパークラスがsuper.

class Super
{
   public void method1()
   {
   }
}

class Sub extends Super
{
   public void method1()
   {
      super.method1();
      //Add more behavior specific to Sub
   }
}
于 2013-05-25T07:16:05.937 に答える