powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обратиться к полю родительского класса
16 сообщений из 16, страница 1 из 1
Обратиться к полю родительского класса
    #39959043
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть класс Group, где указываются два поля: список Element и Тип группы. Есть класс Element и там есть метод Method1, который присваивает значение в поле Result в зависимости от типа группы.
C#
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
using System;
using System.Collections.Generic;

namespace ConsoleApp1_test1
{
    public enum GroupType
    {
        GroupType1 = 0,
        GroupType2 = 1,
        GroupType3 = 2
    }

    class Group 
    {
        public List<Element> Elements;
        public GroupType GroupType;       

        public Group(List<Element> elements, GroupType groupType)
        {
            Elements = elements;
            GroupType = groupType;            
        }
    }

    class Element
    {
        public int Number;
        public int Result;
        public GroupType GroupType;

        public Element(int number, GroupType groupType)
        {
            Number = number;
            GroupType = groupType;
        }

        public void Method1()
        {
            if (GroupType == GroupType.GroupType1)
            {
                Result = 100;
            }
            else if (GroupType == GroupType.GroupType2)
            {
                Result = 200;
            }
            else if (GroupType == GroupType.GroupType3)
            {
                Result = 300;
            }
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {            
           //...
        }
    }
}

Получается что в классе Group и Element присваивается одинаковые поля. Логичнее, если бы поле присутствовало только в классе Group. Тогда в методе Method1 нужно будет иметь доступ к родительскому классу текущего элемента, чтобы определить тип группы.

В данном случае метод Method1 запускаем не в классе Group, где известен тип группы, а именно в классе Element. Это просто тестовый пример, чтобы понимать как обращаться к определенному полю родительскому класса.

Приходит идея написать так:
C#
Код: 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.
class Element
    {
        public int Number;
        public int Result;
        public Group Parent;

        public Element(int number, Group obj)
        {
            Number = number;
            Parent = obj;
        }

        public void Method1()
        {
            if (Parent.GroupType == GroupType.GroupType1)
            {
                Result = 100;
            }
            else if (Parent.GroupType == GroupType.GroupType2)
            {
                Result = 200;
            }
            else if (Parent.GroupType == GroupType.GroupType3)
            {
                Result = 300;
            }
        }       
    }

Получается в списке в каждом элементе будет присутствовать ссылка на целый объект класса Group. В общем, не уверен, что я правильно пишу код.

Скажите, как можно правильно обратиться к полю родительского класса?
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959044
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Обратиться к полю родительского класса
обращаться к полю родительского класса - плохая идея.
Дальше не читал
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959045
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Это просто тестовый пример
из-за этого не получается дать дельный совет.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959113
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Получается в списке в каждом элементе будет присутствовать ссылка на целый объект класса Group.

И? В чем проблема? Что смущает в хранении ссылки на целый экземпляр класса?
ferzmikk
Скажите, как можно правильно обратиться к полю родительского класса?

Здесь нет никакого родительского класса, есть просто некий класс, хранящий список других классов. Отношение родитель/потомок тут и близко не пробегало.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959115
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если время жизни родительского объекта равно времени жизни порожденного, то в обратной ссылке нет ничего страшного, использовать надо не поля, а свойства.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959118
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взаимная ссылка классов друг на друга всегда чревата граблями, вплоть до утечки памяти.
Здесь ТС пытается создать именно циклическую ссылку.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959182
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Скажите, как можно правильно обратиться к полю родительского класса?


Может озвучите исходную задачу?
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959187
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код с паблик-полями должен на ревью сразу отправляться в треш. На такой косяк, как "высовывание" наружу из класса коллекции в виде List<T> при этом уже можно даже и не смотреть.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959191
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Взаимная ссылка классов друг на друга всегда чревата граблями, вплоть до утечки памяти.
Здесь ТС пытается создать именно циклическую ссылку.

Так GC ведь, какие проблемы. В тех же моделях EF взаимные ссылки по navigation properties сплошь и рядом.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959193
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Так GC ведь, какие проблемы. В тех же моделях EF взаимные ссылки по navigation properties сплошь и рядом.
в EF сущности не содержат логики и уничтожаются вместе с контекстом.

Что ваяет ТС мы не знаем
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959202
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
в EF сущности не содержат логики и уничтожаются вместе с контекстом.

Что ваяет ТС мы не знаем


Что значит "уничтожаются"? Это же не С++ с оператором delete. В винформс, еще, кстати, циклические ссылки тоже повсюду, потому то любое использование events это неявная циклическая ссылка. Собственно, это есть один из огромных плюсов GC, что ему такие вещи нипочем. Если бы мы жили в мире где все структуры строго иеархические без циклических ссылок, то c головой хватило бы обычного reference counting, как в COM.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959247
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
из-за этого не получается дать дельный совет.
hVostt
Может озвучите исходную задачу?

Задачу, которую решаю, - пробую написать нейронную сеть на C#. Пока простую. Я знаю, что для написании нейросети больше всего подходит Python с соответствующими библиотеками. На Python разрабатывал. Учитывая, что Python медленный.

Cоздаешь класс Neuron с двумя свойства: входящие нейроны и веса. В классе Layer присутсвует свойство List<Neuron> и свойство Type. Перечисление Type имеет значения Input, Hidden и Output. Учитывая, что в одном нейроне надо делать расчеты, то надо учитывать Type нейрона и поэтому в класс добавил свойство Type. Но все равно иметь Type в двух классах не логично, если в одном слое указали определенный тип слоя, то входящие нейроны в этой слой имеет такой же тип. Поэтому задался вопросом: во втором классе не задавать Type и подумать как внутри класса Neuron можно определить Type оптимальным способом. Тут еще многое зависит как задашь архитектуру проекта для нейронной сети (не архитектура самой нейронной сети, где задается количество слоев, количество нейронов в каждом слое).

Если данную задачу сложно решить и/или значительно повлияет на производительность компьютера, то можно тогда уж не усложнять, в классе Neuron оставить свойство Type.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959257
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Тут полиморфизмом очень сильно попахивает, хотя бы уже судя по множественным ветвлениям на основе значения Type.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39959769
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня была аналогичная ситуация в WPF-проекте, кода нужно было хранить ссылку на родительский объект.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    public class BaseContaiter
    {
        IEnumerable<Item> items { get; }
    }

    public class Item
    {  
    }


Во View была коллекция BaseContaiter, внутри каждого соответственно была своя коллекция Item.
Нужно было реализовать Drag-and-Drop Item из одного BaseContaiter в другой, соответственно чтобы в том BaseContaiter, из которого перетащили этот элемент удалился, а в тот, который перетащили-добавился. Метод Drag-and-Drop получает в себя только экземпляр Item, соответственно из какого он BaseContaiter-неизвестно. Тогда делал ссылку в Item на BaseContaiter. Это работало, но очень редко всеже бывали неотлавливаемые и невоспроизводимые баги, причиной которых я подозреваю эту схему.
Сейчас сделал бы еще один прокси объект, что-то вроде словаря, в котором бы хранилась информация к какому BaseContaiter относится каждый Item и все операции по перемещению производил бы через него, но от ссылок на класс контейнер отказался, потому что логика очень сильно размазывается по многим объектам. Может есть еще более классный вариант, но я пока додумался только до второго.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39960156
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Учитывая, что в одном нейроне надо делать расчеты, то надо учитывать Type нейрона и поэтому в класс добавил свойство Type.


Как сказали выше, это решается полиформизмом с абстрактным методом расчёта. Создаёте наследников-нейронов конкретного типа, которые сами знают как себя вычислять.

Другой подход, это мост. По сути нейрон содержит ссылку на метод вычисления, а не тип. Наследование дешевле, мост дороже, но гибче.


ferzmikk
Если данную задачу сложно решить и/или значительно повлияет на производительность компьютера, то можно тогда уж не усложнять, в классе Neuron оставить свойство Type.


Если берёте язык C#, используйте его преимущества. Не надо решать задачу на C#, как будто у вас бейсик.
...
Рейтинг: 0 / 0
Обратиться к полю родительского класса
    #39960187
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вадима Шванова на ютубе была реализация нейросети на C#- посмотри.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обратиться к полю родительского класса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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