我有一個類(Base)和一個InfoBase類型的字段來存放一些信息。基地的專業化(Ext)需要持有附加信息(InfoExt)。 因此Ext將一個InfoExt分配給Base.info。然而,我遇到問題時 基地替換信息,因爲它會分配info = new InfoBase()
因此 InfoExt的其他信息丟失。如何擴展基本成員字段?
因此,我創建了基地(變體A)中的abstract void assign()
。在這個 案例信息需要被輸出到InfoExt每次它在外部使用。
在變式B中,我還額外創建了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中提供一個信息字段,該子類可以用來存儲擴展信息?
謝謝您的考慮
我不確定如果明白你的問題,你說問題是'info'總是需要被鑄造,但是你沒有解決A或B的問題。 –
In B:Ext'.info是InfoExt類型的,因此Ext'可以在沒有強制轉換(從InfoBase到InfoExt)的情況下以InfoExt的形式訪問它。我希望這能夠澄清它。 –
我認爲你的問題是你要求對象提供信息,而不是告訴他們該怎麼做 - http://pragprog.com/articles/tell-dont-ask – SpaceTrucker