powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# архитектура нескольких классов
25 сообщений из 25, страница 1 из 1
C# архитектура нескольких классов
    #38589581
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен совет, как построить некую архитектуру. Попытаюсь описать на простом примере:

Есть несколько классов, унаследованных от абстрактного класса "Дом"Коттедж : Дом
Хибара : Дом
Таунхаус : ДомЕсть несколько классов, унаследованных от абстрактного класса "Человек"Мужик : Человек
Баба : Человек
Мальчик : Человек
Девочка : ЧеловекВ каждом наследнике Дома есть собственный набор полей (жильцов), типа наследников ЧеловекаКоттедж.папа = new Мужик
Коттедж.мама = new Баба
Коттедж.дочка = new Девочка
Коттедж.бабушка = new Баба
Хибара.папа = new Мужик
Хибара.дедушка = new Мужик

Задачи:
1) Экземпляр класса Дом должен уметь перечислить все имеющиеся экземпляры типа Человек для этого класса (либо поля этого типа) - в Коттетдже живут Мужик, Баба, Девочка, Баба
2) Экземпляр наследника Человека должен уметь обратиться к ресурсам Дома (в частности к вышеуказанному перечислению, ну и к другим ресурсам) -Девочка может посмотреть счет за электричество в Коттедже
3) Экземпляр наследника Человека должен знать имя поля, которому он присвоен - один из экземпляров Мужика в Хибаре знает, что его в данном случае зовут "дедушка"
4) Нужно максимально упростить написание кода классов - наследников Дом, в которых может быть много разнообразных жильцов.


Навскидку получается:
Создать в Дом коллекцию, в которую будут добавляться экземпляры жильцов по мере создания экземпляров. В конструктор экземпляра жильца передавать ссылку на класс-создатель (тогда жилец сам себя сможет зарегистрировать в коллекции Дома), а также передавать в конструктор имя поля. Не нравится в этом подходе громоздкость конструктора жильцов и двойное хранение ссылки на экземпляр.
Возможно, у меня не хватает опыта, чтобы создать более красивый и правильный вариант.
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589589
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proтогда жилец сам себя сможет зарегистрировать в коллекции Дома).

Так делать не надо. Добавлять в коллекцию нужно в другом классе.

Shocker.ProЭкземпляр наследника Человека должен знать имя поля, которому он присвоен - один из экземпляров Мужика в Хибаре знает, что его в данном случае зовут "дедушка"


Зачем, если
Код: c#
1.
Human newHuman = new GrandPa();


итак все известно, ху из ху
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589629
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisShocker.Proтогда жилец сам себя сможет зарегистрировать в коллекции Дома).Так делать не надо. Добавлять в коллекцию нужно в другом классе.как именно? создавать какой-то третий класс? Не очень понял.


PallarisЗачем, если
Код: c#
1.
Human newHuman = new GrandPa();


итак все известно, ху из хуКак экземпляру GrandPa получить строку "newHuman"?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589639
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro[

PallarisЗачем, если
Код: c#
1.
Human newHuman = new GrandPa();


итак все известно, ху из хуКак экземпляру GrandPa получить строку "newHuman"? this, не?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589650
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз, мне нужно получить переменную типа string, внутри которой будет находиться строка "newHuman". Alex Kuznetsov, плиз, подскажите на примере, как это можно сделать через this
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589659
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proкак именно? создавать какой-то третий класс? Не очень понял.


Код: c#
1.
2.
3.
House newHouse = new Cottege();
Human newHuman = new GrandPa();
newHouse.AddResident(newHuman);



Как экземпляру GrandPa получить строку "newHuman"?

Зачем "newHuman"? Ну впрочем
Код: c#
1.
2.
3.
4.
5.
public class GrandPa : Human
{
    public override string toString()
    { return "I'm a human! (and pretty old one)";}
}
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589666
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и про имя - добавить к классу Human поле
Код: c#
1.
publis string name {set;get;}



это ж самые азы, в чем трудность-то?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589673
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris,
прочти пожалуйста то, что я написал в первом посте в разделе "Навскидку получается:"
Азы понятны.
Я предполагаю, что существует какой-то иной вариант всей архитектуры, который решает четыре изложенных Задачи, а не одну из них.
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589680
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisShocker.Proкак именно? создавать какой-то третий класс? Не очень понял.


Код: c#
1.
2.
3.
House newHouse = new Cottege();
Human newHuman = new GrandPa();
newHouse.AddResident(newHuman);

дело в том, что жилец, это должно быть поле класса Cottege и иметь конкретный тип GrandPa, а не просто входить в коллекцию элементов типа Human. Мне нужно будет работать и со специфическими методами класса GrandPa


PallarisЗачем "newHuman"? Ну впрочем
Код: c#
1.
2.
3.
4.
5.
public class GrandPa : Human
{
    public override string toString()
    { return "I'm a human! (and pretty old one)";}
}

мы не обсуждаем вопрос "зачем". Класс "GrandPa" должен знать имя поля, которому его присвоили при создании. Понятно, что можно передать эту строку в конструктор, может есть еще варианты?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589691
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro]дело в том, что жилец, это должно быть поле класса Cottege и иметь конкретный тип GrandPa, а не просто входить в коллекцию элементов типа Human.


В методе AddResident присваивай, как хочешь и куда хочешь

Мне нужно будет работать и со специфическими методами класса GrandPa


Читаем про полиморфизм

Понятно, что можно передать эту строку в конструктор, может есть еще варианты?

Можно в конструкторе, можно потом присвоить, можно вообще не использовать никаких строк - дедушек может ведь быть 0, 1, 2 - это ты собираешься делать поля GrandPa1, GrandPa2, GrandPa3 для Cottege?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589744
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНавскидку получается:
Создать в Дом коллекцию, в которую будут добавляться экземпляры жильцов по мере создания экземпляров. В конструктор экземпляра жильца передавать ссылку на класс-создатель (тогда жилец сам себя сможет зарегистрировать в коллекции Дома), а также передавать в конструктор имя поля. Не нравится в этом подходе громоздкость конструктора жильцов и двойное хранение ссылки на экземпляр.
Возможно, у меня не хватает опыта, чтобы создать более красивый и правильный вариант.

Экземпляр жилец должен иметь следующие поля:
1. Ссылка на дом
2. Ссылка на человека
3. Название человека в доме
т.о.
Конструктор:

Код: c#
1.
public Жилец(Дом house, Человек human, string name)
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589781
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

Да это все понятно. Я хотел избежать громоздкого конструктора при вызове жильцов, потому что таких вызовов в доме будет достаточно много. Но, видимо, вариант только прямолинейный...
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589797
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisAddResidentвидимо, сделаю именно так
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589800
Tamozhnya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перечисление всех полей нужного типа
Код: c#
1.
2.
3.
4.
5.
6.
PropertyInfo[] propertyInfos = type.GetPropertiesInfo();
foreach(PropertyInfo propertyInfo in propertyInfos) {
	Type propertyType = propertyInfo.PropertyType;
	if(propertyType.IsSubclassOf(typeof(Human)) || propertyType == typeof(Human)) {
	}
}
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589896
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proеще раз, мне нужно получить переменную типа string, внутри которой будет находиться строка "newHuman"... Что есть newHuman - это ссылка на объект, ссылка по определению не имеет имени, т.к. это просто адрес памяти...
Поэтому без введения отдельного поля в класс Human (либо его потомков) никак не получить то, что Вы хотите.

PS. А что такого напряжного в том, чтобы добавить параметр в конструктор, или сделать поле в классе, которое будет содержать то, что Вам нужно?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589905
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Propation,

Да это все понятно. Я хотел избежать громоздкого конструктора при вызове жильцов, потому что таких вызовов в доме будет достаточно много. Но, видимо, вариант только прямолинейный...Ну и сделайте в классе Human абстрактный метод, который будет возвращать имя потомка(но не имя переменной объекта, т.к. мы же помним что такое объект, да?). А реализовывать этот метод будут потомки:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  public abstract class Human{
    ...
    public abstract string WhoAmI();
    ...
  }
  ...
  public class GrandPa : Human{
    ...
    public override string WhoAmI(){
       return "GrandPa";
    }
    ...
  }
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38589928
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovЧто есть newHuman - это ссылка на объект, ссылка по определению не имеет имени, т.к. это просто адрес памяти...С одной стороны твоя правда. С другой стороны тут я могу получить имя. Через рефлексию по идее тоже, ведь класс публичный - его поля тоже. Так что это не совсем адрес памяти.


TamozhnyaПеречисление всех полей нужного типаБольшое спасибо, задавая вопрос, я как раз ожидал подобных ответов.
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38590175
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAlex Kuznetsovskiped...С одной стороны твоя правда. С другой стороны тут я могу получить имя. Через рефлексию по идее тоже, ведь класс публичный - его поля тоже. Так что это не совсем адрес памяти.
Ну что-же, если сможете получить имя ПЕРЕМЕННОЙ, то вперёд ... только потом код не забудьте показать...
А особенно меня удивят имена объектов(переменных) в массиве оных...
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38590185
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смешались в кучу люди, кони..
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38590192
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisСмешались в кучу люди, кони..Это про что?
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38590277
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovPallarisСмешались в кучу люди, кони..Это про что?

Про задачу топикстартера
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38590295
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovА особенно меня удивят имена объектов(переменных) в массиве оных...у меня так получается, что это две разных сущности по идее, есть поле, а есть некий ключ - название поля (который участвует в некоторых сериализациях и т.п.). Но по соглашению для удобства имя поля и имя этого ключа совпадают, поэтому я и рассмотрел вопрос получения имени поля...

Впрочем, я сейчас склоняюсь-таки к варианту отказаться от полей и оставить только коллекцию, где ключ будет выполнять свое прямое назначение, тогда смеси коней-людей не будет.
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38590326
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisAlex Kuznetsovпропущено...
Это про что?

Про задачу топикстартераАаа, ну так-то да...
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38597394
Andemki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Для первого пункта можно в производном классе от класса Дом создать метод GetEnumerator() с возвращаемым значением типа IEnumerator и в нём перечислять элементы массива абстрактного класса "Человек" с помощью yield.
Ну а в Main пройти по элементам объекта этого класса с помощью foreach. Как-то так:
Код: 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.
class Program
    {
        static void Main(string[] args)
        {
            House house1 = new House();
            foreach (People p in house1)
            {
                Console.WriteLine(p.Name);
            }
            Console.ReadLine();
        }
    }
class House : Building
    {
        public House(string name = "House") : base(name) { }
        People[] housePeoples = { new Man("m1"), new Man("m2"), new Woman("w1") };

        public IEnumerator GetEnumerator()
        {
            foreach (People p in housePeoples)
            {
                yield return p;
            }
        }
    }
...
Рейтинг: 0 / 0
C# архитектура нескольких классов
    #38597476
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndemkiShocker.Pro,

Для первого пункта можно в производном классе от класса Дом создать метод GetEnumerator() с возвращаемым значением типа IEnumerator и в нём перечислять элементы массива абстрактного класса "Человек" с помощью yield.
Ну а в Main пройти по элементам объекта этого класса с помощью foreach.
Как-то так:
Код: 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.
class Program
    {
        static void Main(string[] args)
        {
            House house1 = new House();
            foreach (People p in house1)
            {
                Console.WriteLine(p.Name);
            }
            Console.ReadLine();
        }
    }
class House : Building
    {
        public House(string name = "House") : base(name) { }
        People[] housePeoples = { new Man("m1"), new Man("m2"), new Woman("w1") };

        public IEnumerator GetEnumerator()
        {
            foreach (People p in housePeoples)
            {
                yield return p;
            }
        }
    }


Эт да, НО автору НЕ ЭТО нужно было...
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# архитектура нескольких классов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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