OOP概念涉及以下情况?

时间:2010-10-14 14:51:06

标签: java oop

我刚刚开始学习Java,我很难找到实现以下内容的正确方法。

我有一个名为State的类。该类有一个名为stateCaptial的字段。

我创建了一个State对象。

然后我想创建链接到一个State对象的许多Town对象。如果我查询该城市的州首府,它应该从州对象获取它。我认为它将被归类为一对多的对象关系?

实施此类解决方案的Java术语是什么?

非常感谢 安迪

8 个答案:

答案 0 :(得分:1)

这将是一对多的关系。

执行此操作的最佳方法是让每个Town对象都有一个状态字段,该字段引用它所属的State。然后,Town的getStateCapital方法将从状态获取stateCapital并返回该状态。

您可能还希望在State对象上拥有一个数组或List of Town对象,以便列出州内的所有城镇。

答案 1 :(得分:1)

您所描述的是您希望Town对象依赖于State对象。将依赖对象插入Town类的行为通常称为依赖注入或DI。

您将拥有与此类似的类结构

public class Town
{    
    private State _state;

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

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

}

答案 2 :(得分:1)

您也可以创建一个Town课程。因此,州有一个叫做Town类型资本的领域。州也有一套“城镇”,以便所有城镇都可以找到一个州。城镇有州的州。像下面的东西。

州级:

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的{​​{1}}对象,则可以使用该城市的州首府:

myTown

如果您有一个名为myTown.getState().getCapital();的{​​{1}}对象,则会获得您使用的所有城镇:

State

答案 3 :(得分:1)

以下是我的想法。这种关系是一对多的(State to Town),所以在代码中表示它看起来像这样:

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);
    }
}

现在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;
    }
}

答案 4 :(得分:0)

为什么不是州内的一系列城镇,每个城镇都回顾他们所在的州?

答案 5 :(得分:0)

你应该研究封装,抽象和可能的继承。

您应该尝试将您创建的每个对象视为封装与其直接相关的数据,并提供访问和操作该数据的方法。

对于此问题,您可以创建两个类,State和Town。

您的州级会员将有一个名为Capital的成员,该成员将属于城镇类型 和一个名为Towns的列表,其中包含其中的所有城镇。城镇班级将有一个名为州的成员。

答案 6 :(得分:0)

从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
}

您可以省略City类中的字符串State_Name,因为您可以使用city.State.Name访问同一属性;无论如何,出于某些目的,将“FK”直接放在子类上可能非常方便。当然,在这种情况下,您应该拥有确保FK与State对象保持同步的代码。如果使用这些类,比如说,通过ORM框架,通常会自动处理。

答案 7 :(得分:0)

聚合和授权..