Проблема с данными - PullRequest
       3

Проблема с данными

1 голос
/ 02 августа 2011

У меня есть проблема в дизайне моего класса.

У меня есть 2 класса:

public class A {
    public B[] _bs;
    public string _name;
}
public class B {
    public string getAName() {
        // The problem
    }
}

На словах: у меня есть два класса A и B. В классе A много Bи B имеет только один A!

Это просто.Но теперь мне нужен атрибут от A до метода B.

Конечно, я могу создать что-то вроде

public class B {
    public A _parent;
    public string getAName() {
        return _parent._name;
    }
}

Но это, я думаю, не очень хороший дизайн ...

Мой язык программирования - C #, но это общая проблема ..

Какие еще возможности я могу использовать?

Ответы [ 5 ]

1 голос
/ 02 августа 2011

Есть ли причина, по которой вы не хотите выставлять все A за свои B?

public class B
{
    public A A {get;set;}
}

Так что вместо:

var aName = b.getAName();

... вы бы сказали:

var aName = b.A.Name;

(В моем мире вы открыли для себя Name свойство и сделали поле _name закрытым.)

Но, в целом, звучит так, как будто вы беспокоитесь о том, чтобы A указывал на B и B указывал на A одновременно. Это стандартная практика, когда вы представляете двунаправленные отношения, подобные тем, о которых вы говорите. В этом нет ничего плохого.

1 голос
/ 02 августа 2011

Ваше решение - нормальный способ сделать это.Я не могу даже думать о другом возможном способе сделать это, не делая что-то нелепое, как декомпиляция DLL.Возможно, ведение списка A и получение B, чтобы найти, в каком A он находится, но все еще очень неправильно.

0 голосов
/ 02 августа 2011
public class A 
{
    public List<B> _listOfB;
    public string Name { get; set; }

    public List<B> ListOfB 
    {
        get { return _listOfB; }
    }

    public A() 
    {
        ListOfB = new List<B>();
    }

    public void AddB(B b) 
    {
        B.InstanceOfA = this;
        ListOfB.Add(b);
    }



}

public class B 
{
    public A InstanceOfA { get; set; }
}

Добавить B к A:

A a = new A();
a.Name = "AAAA";
A.AddB(new B());
A.AddB(new B());
A.AddB(new B());

Это:

foreach(B b in A.ListOfB)
{
    Console.WriteLine(b.InstanceOfA.Name);
}

Результатом будет:

AAAA
AAAA
AAAA

Но, как всегда, конечно, есть более одного "хорошего" решения :) (например, вы можете добавить конструктор в B, где вы передадите ссылку на A)

(позаботьтесь о том, чтобы вы использовали AddB (), а не ListOfB.Add (), в противном случае InstanceOfA не устанавливается (и, конечно, вы можете установить его самостоятельно и в любом случае добавить его в ListOfB)

Надеюсь, это поможет.

0 голосов
/ 02 августа 2011

Два предложения:

  • Если свойство является фиксированным, это может быть параметром для конструктора B, поэтому B все еще не знает об A
  • A реализует интерфейс, и интерфейс предоставляет только определенные свойства, и B имеет ссылку на это. Вы можете просто передать это, установить или придумать и использовать внедрение зависимостей
0 голосов
/ 02 августа 2011

Пусть метод принадлежит A, а A вызывает метод B (возможно, передавая информацию A в B в качестве параметра). Вы правы, полагая, что сомнительное дизайнерское решение взять B на себя ответственность за распространение / обработку информации A.

...