1

クラスコンポーネントがあります

abstract class Component{
    private componentType m_type;

    public Component(componentType type)
    {
        m_type = type;
    }
}

および 2 つのサブクラス

class AmplifierComponent extends Component{
    public AmplifierComponent()
    {
        super(componentType.Amp);
        System.out.print(this.m_type);
    }
}

class AttenuatorComponent extends Component{
    public AttenuatorComponent()
    {
        super(componentType.Att);
        System.out.print(this.m_type);
    }
}

私の問題は次のとおりです。 1. m_type が表示されないため、どの種類のコンポーネントもインスタンス化できません (どういう意味ですか?)
2. ユーザーがチェーンに挿入したすべてのコンポーネントの配列を作成する必要があります。Component クラスの配列を作成できません。

誰かがデザインを手伝ってくれますか?
またはいくつかの回避策がありますか?

前もって感謝します

4

3 に答える 3

6

タイプメンバーが必要な理由がわかりません。これは冗長に見えます。代わりに、次のように簡単に実行できます。

abstract class Component{
}

class AttenuatorComponent extends Component{
    public AttenuatorComponent() {
       // calls the default super constructor
    }
}

クラスが適切に動作するためにポリモーフィズムに依存します。対応するクラスを宣言した場合、階層型を識別する型メンバーを持つ必要はありません。protectedクライアントからではなく、サブクラスで表示する必要があるメンバー変数がある場合は、 private.

Component関連付けられている機能/データがない場合は、インターフェイスになる可能性があります。

配列宣言は次のようになります

Component[] components = new Component[20];
components[0] = new AttenuatorComponent();

ポリモーフィズムとは、このコンポーネントの配列を繰り返し処理し、 で宣言されている (ただし必ずしも実装されているとは限らない) 適切なメソッドを呼び出しComponent、適切なサブクラス メソッドが呼び出されることを意味します。

于 2012-12-14T10:59:10.590 に答える
0
abstract class Component {
    private componentType m_type;

    public Component(componentType type)
    {
        m_type = type;
    }

    public componentType getType()
    {
        return this.m_type;
    }
}

class AmplifierComponent extends Component{
    public AmplifierComponent()
    {
        super(componentType.Amp);
        System.out.print(super.getType());
    }
}

class AttenuatorComponent extends Component{
    public AttenuatorComponent()
    {
        super(componentType.Att);
        System.out.print(super.getType());
    }
}

そうすれば、m_type を読み取ることはできますが、変更することはできません。getType() コマンドを保護することもできます。これにより、それを継承するクラスを介してのみ到達可能になります。

于 2014-02-05T23:03:35.210 に答える
0

m_type を protected に設定して、子クラスから参照できるようにします。

于 2012-12-14T11:00:25.147 に答える