我剛剛開始學習Java,並且正在努力尋找實現以下方法的正確方法。什麼OOP概念處理以下情況?
我有一個叫State的類。這個類有一個叫做stateCaptial的字段。
我創建一個狀態對象。
然後我想要創建很多與一個State對象相關的Town對象,如果我查詢它的州會城市,它應該從狀態對象中獲取它。我認爲這會被歸爲一對多關係?
實施此類解決方案的Java術語是什麼?
非常感謝 安迪
我剛剛開始學習Java,並且正在努力尋找實現以下方法的正確方法。什麼OOP概念處理以下情況?
我有一個叫State的類。這個類有一個叫做stateCaptial的字段。
我創建一個狀態對象。
然後我想要創建很多與一個State對象相關的Town對象,如果我查詢它的州會城市,它應該從狀態對象中獲取它。我認爲這會被歸爲一對多關係?
實施此類解決方案的Java術語是什麼?
非常感謝 安迪
您也可以創建一個Town
類。因此,國家有一個叫做城鎮資本的領域。國家也有一套「鎮」,以便所有的城鎮都可以被看作是一個國家。小鎮有一個田野狀態的州。像下面的東西。
State類:
public class State {
private Town capital;
private Set<Town> towns;
public State() {
this.towns = new HashSet();
}
public State(Town capital) {
this.capital = captial;
this.towns = newHashSet();
this.towns.add(capital)
}
public void setCapital(Town capital) {
this.captial = capital;
}
public Town getCapital() {
return this.capital;
}
public void addTown(Town town) {
this.towns.add(town)
}
public Set getTowns() {
return this.towns;
}
}
鎮類:
public class Town {
private State state;
public Town() {}
public Town(State state) {
this.state = state;
this.state.addTown(this);
}
public void setState(State state) {
this.state = state;
this.state.addTown(this);
}
public State getState() {
return this.state;
}
}
然後,如果你有一個Town
對象調用myTown
,拿到鎮上的州首府你使用:
myTown.getState().getCapital();
如果您有State
對象調用myState
,你得到所有城鎮的使用:
myState.getTowns();
爲什麼不在城鎮的狀態數組,每個指回他們的狀態?
這將是一對多的關係。
做到這一點的最好方法是讓每個Town對象都有一個指向它所屬狀態的狀態字段。然後,Town的getStateCapital方法將從狀態中獲得stateCapital並返回。
您可能還希望在狀態對象上有一個數組或城鎮對象列表,以便您可以列出一個州內的所有城鎮。
您所描述的是您希望Town對象依賴於State對象。將依賴對象插入Town類的行爲通常稱爲依賴注入或DI。
你將不得不與此類似
public class Town
{
private State _state;
public Town(State state)
{
_state = state;
}
public string StateCapital()
{
return _state.Capital;
}
}
我D可能已經使用屬性而不是方法來獲得狀態資本,但我不記得Java屬性和C#屬性了。 – 2010-10-14 15:08:39
這只是一個單向關係的小警告 - 他可能不僅希望通過「城鎮」找到一個「國家」,而且還要通過「國家」內的所有「城鎮」。 – mway 2010-10-14 15:09:59
你可以使它成爲一個雙向關聯是的,但是我總是發現雙向關聯的工作非常複雜,並且通常會改變關係使其成爲單向的,並且如果實際需要的話提供替代方式來達到關係的互補側。很多時候雙向關聯屬於YAGNI(你不需要它) – 2010-10-14 15:39:29
類結構你應該看看封裝,抽象和繼承的可能。
您應該嘗試將您創建的每個對象都視爲封裝與其直接相關的數據,並提供訪問和操作該數據的方法。
對於這個問題,您可以創建兩個類State和Town。
您的州級班級將有一個名爲Capital的會員,該會員將會輸入城鎮 和名爲Towns的列表,其中包含城鎮中的所有城鎮。鎮上會有一個叫做州的成員。
從一個角度OOP的一點,那就是要正確執行。我將使用C#語法,因爲我熟悉它,但它不應該與java差別太大。
public class State
{
public string Name {get;set;}
public ICollection<City> Cities {get;set;} //Access to all child cities
}
public class City
{
public string Name {get;set;}
public string State_Name {get;set;} //this is sort of a FK
public State State {get;set;} //Direct access to the State object related
}
你可以從市級省略串STATE_NAME,你可以達到使用city.State.Name相同的屬性;無論如何,爲了某些目的,可以非常方便地將「FK」直接放在兒童班上。當然,在這種情況下,您應該有確保FK保持與State對象同步的代碼。如果使用這些類,比方說,通過ORM框架,通常會自動處理這些類。
這是真的java代碼?這與C#無法區分。 – 2010-10-14 15:41:06
-1 java問題上的C# – bwawok 2010-10-14 15:54:14
@bwawok噢,我的天啊,人們真的可以那麼密嗎?我猜是這樣。語法真的很重要嗎?這是重要的概念。我明確指出我會使用c#語法,因爲我熟悉它。我可以爲此編寫僞代碼,這個概念適用於任何語言。但我想你是那種「特定語言」的粉絲之一,他們貶低任何提及不同於他們心愛的語言的人。我*想* stackoverflow有一個成熟的人的社區,但我顯然是錯的。 – 2010-10-14 15:57:12
聚集和委託..
這是我的想法。的關係是一對多(國城)這樣表示此代碼會是這個樣子:
public class State {
private Set<Town> towns;
public State() {
// default constructor
}
public State(Set<Town> towns) {
this.towns = towns;
}
public void createTown(Town town) {
towns.add(town);
}
}
目前全鎮類可以是這個樣子:
public class Town {
private State state;
private boolean isCapital;
public Town() {
// default constructor
}
public Town(State state) {
this.state = state;
}
public void setCapital(boolean isCapital) {
this.isCapital = isCapital;
}
}
Town.getState()的接口是否正確? – Huperniketes 2010-10-14 19:20:49
@Huperniketes不是 - 它不是。複製並粘貼FAIL。我現在更新了它。 Town.getState()返回類型應該是狀態。 – Owen 2010-10-14 19:35:38
我喜歡它!這似乎是最深入的答案。其他一些人提到Dependancy注射劑,這種解決方案是DI的一種形式嗎?我最終想要將所有對象粘貼在數據庫中。我試着從頭開始正確的方式 - 如果你知道我的意思。 – AndyM 2010-10-18 18:45:24