powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Реализация на C# оne-many
5 сообщений из 5, страница 1 из 1
Реализация на C# оne-many
    #38141873
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такая: нужно реализовать классами C# структуру для отношений один-ко-многим.
Делаю примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class A
{
     public List<B> Children;  // для хранения подчинённых экземпляров

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

/// экземпляры класса B не могут существовать без привязки к классу А
class B
{
    public A Parent;

    public B(A _parent)
    {
          Parent = _parent;
    }
}



Если теперь написать в коде
Код: c#
1.
2.
A a = new A();
B b1 = new B(a);


то a.Children ничего не будет знать о новом объекте. А впихивать его отдельной командой a.Children.Add(b1) мне кажется дурным тоном.

Можно переписать конструктор для класса B
Код: c#
1.
2.
3.
4.
5.
public B(A _parent)
    {
          Parent = _parent;
          Parent.Children.Add(this);
    }


однако тогда например код
Код: c#
1.
2.
A a = new A();
a.Children.Add(new B(a));


будет работать некорректно.

Есть ли готовые шаблоны для реализации подобных задач? Не хотелось бы изобретать велосипед.
...
Рейтинг: 0 / 0
Реализация на C# оne-many
    #38141897
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
using System.Collections.Generic;

namespace DomainModel
{
    public class A
    {
        private readonly List<B> children = new List<B>();

        public IEnumerable<B> Children
        {
            get { return children; }
        }

        public void Add(B child)
        {
            child.Parent = this;
            children.Add(child);
        }
    }

    public class B
    {
        public A Parent { get; internal set; }
    }
}
...
Рейтинг: 0 / 0
Реализация на C# оne-many
    #38142240
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Спасибо. В принципе годится. Единственно не избавлены от создания пустых не привязанных объектов
B b = new B();
...
Рейтинг: 0 / 0
Реализация на C# оne-many
    #38142282
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sutniСпасибо. В принципе годится. Единственно не избавлены от создания пустых не привязанных объектов
B b = new B();
сделай для B internal конструктор, создать отвязанный от родителя не сможешь,
но бесхозный может продолжить существовать после удаления из списка детей
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
public class A
    {
        private readonly List<B> children = new List<B>();

        public IEnumerable<B> Children
        {
            get { return children; }
        }

        public B CreateChild()
        {
            B child = new B();
            child.Parent = this;
            children.Add(child);
            return child;
        }

        public void RemoveChild(B child)
        {
            child.Parent = null;
            children.Remove(child);
        }

    }

    public class B
    {
        internal B() { }
        public A Parent { get; internal set; }
    }
...
Рейтинг: 0 / 0
Реализация на C# оne-many
    #38142285
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sutni,

Последнее замечание снимается. В классе В реализую конструктор
Код: c#
1.
2.
3.
4.
public B(A _p)
        {
            _p.Add(this);
        }
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Реализация на C# оne-many
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]