2010-10-14 4 views
2

Я только начинаю изучать Java, и я изо всех сил пытаюсь найти правильный способ реализовать следующее.Что такое концепция ООП в следующей ситуации?

У меня есть класс под названием State. Этот класс имеет поле под названием stateCaptial.

Я создаю объект State.

Затем я хочу создать много объектов города, которые связаны с одним объектом State. Если я запрашиваю город для его государственного капитала, он должен получить его из объекта состояния. Я думаю, что это будет относиться как к многим объектным отношениям?

Что такое терминология Java для реализации такого решения?

Большое спасибо Энди

ответ

1

Вы также можете создать класс Town. Итак, в государстве есть поле под названием capital типа 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();

+0

Является ли интерфейс для Town.getState() правильным? – Huperniketes

+0

@ Huperniketes Nope - не было. Скопируйте и вставьте FAIL. Я обновил его сейчас. Возвращаемый тип Town.getState() должен быть State. – Owen

+0

Мне это нравится! Это, пожалуй, самый глубокий ответ. Некоторые из других упоминают об инъекции Зависимости, является ли это решение формой DI? В конечном итоге я хочу привязать все объекты в БД. Я пытаюсь начать с нуля правильным способом - если вы понимаете, что я имею в виду. – AndyM

0

Почему не массив городов в штате, каждый возвращаясь к состоянию, они находятся в?

1

Это будет отношение ко многим.

Лучшим способом сделать это было бы, чтобы каждый объект города имел поле состояния, которое ссылается на состояние, в котором оно входит. Метод getStateCapital города затем получит stateCapital из своего состояния и вернет его.

Возможно, вы захотите также иметь массив или объект «Список городов» объекта State, чтобы вы могли перечислить все города в пределах штата.

1

Что вы описываете, так это то, что вы хотите, чтобы ваши объекты города зависели от объекта State. Акт вставки зависимого объекта в класс Town обычно известен как инъекция зависимости или DI.

Вы бы классовую структуру, подобную этой

public class Town 
{  
    private State _state; 

    public Town(State state) 
    {   
     _state = state;   
    }  

    public string StateCapital() 
    {   
     return _state.Capital; 
    }  

} 
+0

Я d, вероятно, использовал свойство вместо метода для получения капитала штата, но я больше не могу помнить свойства java vs C#. –

+0

Это второстепенное предостережение только о односторонних отношениях - он, вероятно, захочет не только найти «Государство» через «Город», но и все «Города» в «Государстве». – mway

+0

Вы можете сделать это двунаправленной ассоциацией да, однако я всегда считал, что двунаправленные ассоциации очень сложны в работе и обычно изменяют отношение, чтобы сделать его однонаправленным и предоставить альтернативные способы для достижения взаимодополняющей стороны отношений, если это действительно необходимо , Много раз двунаправленные ассоциации попадают под YAGNI (вам это не понадобится) –

0

Вы должны смотреть в инкапсуляция, абстракции и, возможно наследование.

Вы должны попытаться подумать о каждом объекте, который вы создаете, в качестве инкапсуляции данных, которые непосредственно связаны с ним, и предоставления методов доступа к этим данным и их работы.

Для этого вопроса вы можете создать два класса: «Штат и город».

Ваш государственный класс будет иметь член под названием Capital, который будет иметь тип города и список городов, в которых есть все города. У городского класса будет член под названием «государство».

0

С точки зрения ООП в это то, что должно быть правильное выполнение. Я собираюсь использовать синтаксис 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, как вы можете достичь того же свойства, используя city.State.Name; Во всяком случае, было бы очень удобно иметь «FK» непосредственно на дочернем классе для некоторых целей. Конечно, в этом случае у вас должен быть код, который гарантирует, что FK будет синхронизироваться с объектом State. Если эти классы используются, скажем, с помощью структуры ORM, обычно это обрабатывается автоматически.

+1

Действительно ли это Java-код? Это неотличимо от C#. –

+1

-1 C# на java вопрос – bwawok

+2

@bwawok О, боже мой, могут ли люди быть такими плотными? Полагаю, что так. Действительно ли синтаксис имеет значение? Это концепция важная вещь. Я четко заявил, что буду использовать синтаксис C#, потому что я знаком с ним. Я мог бы написать псевдокод в этом отношении, эта концепция применяется независимо от языка. Но я думаю, что вы один из тех «специфических» фанатов, которые опускают всех, кто упоминает язык, отличный от своего любимого. Я * THOUGHT * stackoverflow имел сообщество зрелых людей, но я явно ошибался. –

1

Вот мои мысли. Отношения это один ко многим (государство в город), так, чтобы представить это в коде, это будет выглядеть примерно так:

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; 
    } 
} 
Смежные вопросы