2

我有一个名为 Star 的类,它有一个

public List<Planet> Planets = new List<Planet>();

有一种方法可以使用所需的变量创建行星,尽管我想要一些关于行星类中可访问的恒星的信息。

现在我用 4 个变量构建“行星类”,但我需要“行星类”中可用的“星类”中的大约 6 个变量。

有没有办法在行星类中引用父星?我将如何传递对行星的引用?

谢谢!

4

4 回答 4

0

您可以在 Planet 类中包含对 Star 的引用。然后,您可以创建一个接受该引用的构造函数,如下所示:

public class Planet
{
   private Star orbits;

   ...

   public Planet(Star orbits)
   {
      this.orbits = orbits;
      ...
   }

   ...
}

然后,您可以像这样在 Star 中实例化它:

public List<Planet> Planets = new List<Planet>(this);
于 2013-09-03T02:48:20.140 回答
0

有很多方法可以做到这一点,只有一个想法:

为您的构造函数创建一个参数怎么样:

private List<Star> _solarSystem;   

Planet(List<Star> solarSystem)
{
    this._solarSystem = solarSystem;
}

从 OO 的角度来看,最好有一个类而不是列表。我假设您发布的代码也在某个类中,那么您的类是如何命名的?

private SolarSystem _solarSystem;   

Planet(SolarSystem solarSystem)
{
    this._solarSystem = solarSystem;
}
于 2013-09-03T02:49:23.527 回答
0

一个典型的解决方案是将类实现的接口注入到依赖类中(依赖注入)。你的情况是这样的:

internal interface IStar
{
    void Method1();
    string Property1 { get; }
    ...
}

internal abstract class Star : IStar
{
    protected Star()
    {
        foreach(string planetName in planetNames)
        {
            Planet p = new Planet(planetName, this);
            Planets.Add(p);
        }
    }

    public void Method1()
    {
        ...
    }

    public string Property1
    {
        get { return string.Empty; }
    }
}

internal class Planet
{
    string name;
    IStar parentStar;

    internal Planet(string name, IStar parentStar)
    {
        this.name = name;
        this.parentStar = parentStar;
    }
}

以这种方式执行此操作允许您传入不同的类,这些类IStar在需要时实现。也许你有基础抽象类,它是由,等Star继承的。不关心你传入什么样的星号,只要它实现了接口。这促进了松散耦合,使您的代码更易于维护。ClassAStarDwarfStarPlanetIStar

于 2013-09-03T02:54:42.223 回答
0

像这样使用字典:

IDictionary<Star, IList<Planet>> planetSystems = new Dictionary<Star, IList<Planet>>();
于 2013-09-03T08:52:21.743 回答