我有一个名为 Star 的类,它有一个
public List<Planet> Planets = new List<Planet>();
有一种方法可以使用所需的变量创建行星,尽管我想要一些关于行星类中可访问的恒星的信息。
现在我用 4 个变量构建“行星类”,但我需要“行星类”中可用的“星类”中的大约 6 个变量。
有没有办法在行星类中引用父星?我将如何传递对行星的引用?
谢谢!
我有一个名为 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
继承的。不关心你传入什么样的星号,只要它实现了接口。这促进了松散耦合,使您的代码更易于维护。ClassAStar
DwarfStar
Planet
IStar
像这样使用字典:
IDictionary<Star, IList<Planet>> planetSystems = new Dictionary<Star, IList<Planet>>();