引用实例化了另一个对象的对象

本文关键字:对象 一个对象 实例化 引用 | 更新日期: 2023-09-27 18:29:54

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

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

有一种方法可以创建具有所需变量的行星,尽管我希望在行星类中可以访问一些关于恒星的信息。

现在,我用4个变量构建了"行星类",但我需要"行星类中"恒星类"中的大约6个变量。

有没有一种方法可以参考行星类中的母恒星?那么我该如何传递对行星的引用呢?

谢谢!

引用实例化了另一个对象的对象

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

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

然后,您可以在Star中实例化它,如下所示:

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

有很多方法可以实现这一点,只有一个想法:

为你的构造函数做一个参数怎么样:

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

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

private SolarSystem _solarSystem;   
Planet(SolarSystem solarSystem)
{
    this._solarSystem = solarSystem;
}

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

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,它由ClassAStarDwarfStar等继承。Planet不在乎你传递了什么样的星,只要它实现了IStar接口。这促进了松散耦合,使代码更易于维护。

像这样使用字典:

IDictionary<Star, IList<Planet>> planetSystems = new Dictionary<Star, IList<Planet>>();