2013-09-03 4 views
2

У меня есть класс с именем звезды, и он имеетСсылка на объект, который создавал экземпляр другого объекта?

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

Существует метод, который создает Planets с переменным необходимо, хотя я хочу некоторую информацию о звезде, доступной в классе планеты.

В настоящее время существует 4 переменных, которые я строю «Класс Планеты», но мне нужно около 6 переменных из «Звездного класса», доступных в «классе планет».

Есть ли способ иметь ссылку на родительскую звезду в классе планеты? и как передать ссылку на Планету?

Спасибо!

ответ

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); 
+0

означает "орбиты частных звезд"; просто укажите на родительскую звезду? или он делает копию и занимает вдвое больше памяти компьютера? –

+0

Просто указывая, потому что новых объектов не создано. – Tintenfiisch

+0

Как упоминает @ user1341210, это указывает на объект Star. В C# (и, фактически, объектно-ориентированных языках вообще), когда вы видите переменную, которая кажется типом класса, если на самом деле является ссылкой. Это означает, что он содержит дескриптор расположения экземпляра (объекта) этого типа класса. Когда вы используете новое ключевое слово, вы создаете экземпляр, и это возвращает ссылку. Эта ссылка является тем, что обычно сохраняется в этом типе ссылочной переменной. – aring

0

Есть много способов для достижения этой цели, только один идея:

Что о создании параметра для contstructor как:

private List<Star> _solarSystem; 

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

С точки зрения OO было бы лучше иметь вместо списка класс. Я предполагаю, что код, который вы опубликовали, также находится в каком-то классе, так как называется ваш класс?

private SolarSystem _solarSystem; 

Planet(SolarSystem solarSystem) 
{ 
    this._solarSystem = solarSystem; 
} 
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, который унаследован ClassAStar, DwarfStar и т. Д. Planet не волнует, какую звезду вы проходите, если она реализует интерфейс IStar. Это способствует ослаблению связи, что упрощает работу с вашим кодом.

+0

Так что IStar в классе Planet просто ссылка? как указатель? или он копирует IStar, который был принят, занимая больше места? –

+0

@JosephDour Поскольку 'Star' объявлен как' class', это ссылочный тип, поэтому 'Planet' просто сохраняет ссылку указателя на него. Это не копирование всего значения содержимого «Звезды». – Gjeltema

0
class Star 
{ 
    private List<Planet> planets = new List<Planet>(); 

    public List<Planet> Planets 
    { 
     get 
     { 
      return this.planets; 
     } 
    } 

    public void AddPlanet(Planet planet) 
    { 
     this.planets.Add(planet); 
     planet.Parent = this; 
    } 
} 

class Planet 
{ 
    public Star Parent { get; internal set; } 
} 
0

Использование словарь, как это:

IDictionary<Star, IList<Planet>> planetSystems = new Dictionary<Star, IList<Planet>>(); 
Смежные вопросы