7

クラス (Base) と、いくつかの情報を保持するタイプ InfoBase のフィールドがあります。Base の特殊化 (Ext) は、追加情報 (InfoExt) を保持する必要があります。したがって、Ext は InfoExt を Base.info に割り当てます。ただし、Base が情報を置き換えるときに問題が発生しました。これは、割り当てられるinfo = new InfoBase()ため、InfoExt の追加情報が失われるためです。

したがってabstract void assign()、ベース(バリアントA)で作成しました。この場合、情報は Ext で使用されるたびに InfoExt にキャストする必要があります。

したがって、バリアント BI では、追加で作成されabstract InfoBase info()ます。

                             variant A                        variant B
+----------------+  +---------------------------+  +----------------------------+
| InfoBase       |  | Base                      |  | Base'                      |
|----------------|  |---------------------------|  |----------------------------|
| + name: String |  | + info: InfoBase          |  | + abstract InfoBase info() |
|                |  | + abstract void assign()  |  | + abstract void assign()   |
|                |  |                           |  |                            |
+----------------+  +---------------------------+  +----------------------------+
          ^                      ^                               ^
          |                      |                               |
          +                      +                               +
+----------------+  +---------------------------+  +----------------------------+
| InfoExt        |  | Ext                       |  | Ext'                       |
|----------------|  |---------------------------|  |----------------------------|
| + id: int      |  | + void assign() {         |  | + InfoExt info             |
|                |  |     info = new InfoExt(); |  | + InfoBase info() {        |
|                |  |   }                       |  |     return info;           |
+----------------+  +---------------------------+  |   }                        |
                                                   | + void assign() {          |
                                                   |     info = new InfoExt();  |
                                                   |   }                        |
                                                   +----------------------------+

.

 class InfoBase {
   public String name;
 }

 abstract class Base {
    abstract public void assign();
    abstract InfoBase info();
 }


 class InfoExt extends InfoBase {
   public int id;
 }

 class Ext extends Base {
    public InfoExt info;

    @Override InfoBase info() { return info; }

    @Override public void assign() { info = new InfoExt(); }
 }

これは一般的な方法で対処する一般的な状況ですか? バリアント A/B に欠点はありますか?

サブクラスが拡張情報を格納するために使用できる情報フィールドを Base に提供するにはどうすればよいですか?

ご検討をお願いいたします

4

4 に答える 4

1

おそらく、このようなものがあなたが探しているものですか?

abstract class Base {
    private InfoBase info; 

    abstract public void assign();

    protected void setInfo(InfoBase info) {
        this.info = info;
    }

    public InfoBase getInfo() { 
        return info;
    }
}

class Ext extends Base {
    private InfoExt info;

    @Override 
    public InfoExt getInfo() { 
        return info;
    }

    @Override
    public void assign() {
        info = new InfoExt();
        setInfo(info);
    }

}

これにより、Base がInfoBaseオブジェクトを提供できるようになり、Ext がサービスを提供できるようになりInfoExtます。

于 2013-01-08T14:59:10.947 に答える
0

ほとんどのデータがアクセスされる InfoBase の 1 つのサブクラスがある場合は、基本クラスのプロパティ 'info' のタイプを InfoExt に変更する必要があります。

近い将来、別のデータと動作を持つ InfoBase の他のサブクラスが作成される可能性があります。その場合は、GOF の Bridge-Pattern を使用することをお勧めします。

于 2013-01-08T14:57:54.783 に答える
0

キャストを回避する方法を探している場合は、これが機能する可能性があります(ジェネリックを使用):

public abstract class Base<T extends InfoBase> {
    protected T info;

    public T info(){
        return info;
    }

    public abstract void assign();
}


public class ExtBase extends Base<InfoExt> {

    @Override
    public void assign() {
        info = new InfoExt();   
    }
}

Info は、サブクラス ExtBase の InfoExt 型になります。元)

ExtBase b = new ExtBase();
b.info() // Returns Type InfoExt
于 2013-01-08T15:09:04.773 に答える
0

私はあなたの問題を完全には理解していませんが、ここにヒントがあります:

通常、Base サブクラスをインスタンス化する場合、各サブクラスは、サブクラスによってオーバーライドされる2 番目のメソッド ( initializeなど)で特定のステートメントを実行します。したがって、たとえば、各サブクラスは特定のInfoBaseサブクラスで情報をインスタンス化します。

その後、Extは InfoBase 固有の動作が必要なメソッドのみをオーバーライドし、情報を適切なクラスにキャストします。

これは最もシンプルなデザインです。あなたのコードの複雑さがわからないので、より具体的な解決策を提供することはできません。ただし、アダプターのパターン、戦略、または状態の使用を検討することもできます (もちろん、解決する問題によって異なります)。

于 2013-01-08T15:12:15.100 に答える