|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Нужен совет, как построить некую архитектуру. Попытаюсь описать на простом примере: Есть несколько классов, унаследованных от абстрактного класса "Дом"Коттедж : Дом Хибара : Дом Таунхаус : ДомЕсть несколько классов, унаследованных от абстрактного класса "Человек"Мужик : Человек Баба : Человек Мальчик : Человек Девочка : ЧеловекВ каждом наследнике Дома есть собственный набор полей (жильцов), типа наследников ЧеловекаКоттедж.папа = new Мужик Коттедж.мама = new Баба Коттедж.дочка = new Девочка Коттедж.бабушка = new Баба Хибара.папа = new Мужик Хибара.дедушка = new Мужик Задачи: 1) Экземпляр класса Дом должен уметь перечислить все имеющиеся экземпляры типа Человек для этого класса (либо поля этого типа) - в Коттетдже живут Мужик, Баба, Девочка, Баба 2) Экземпляр наследника Человека должен уметь обратиться к ресурсам Дома (в частности к вышеуказанному перечислению, ну и к другим ресурсам) -Девочка может посмотреть счет за электричество в Коттедже 3) Экземпляр наследника Человека должен знать имя поля, которому он присвоен - один из экземпляров Мужика в Хибаре знает, что его в данном случае зовут "дедушка" 4) Нужно максимально упростить написание кода классов - наследников Дом, в которых может быть много разнообразных жильцов. Навскидку получается: Создать в Дом коллекцию, в которую будут добавляться экземпляры жильцов по мере создания экземпляров. В конструктор экземпляра жильца передавать ссылку на класс-создатель (тогда жилец сам себя сможет зарегистрировать в коллекции Дома), а также передавать в конструктор имя поля. Не нравится в этом подходе громоздкость конструктора жильцов и двойное хранение ссылки на экземпляр. Возможно, у меня не хватает опыта, чтобы создать более красивый и правильный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 15:28 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.Proтогда жилец сам себя сможет зарегистрировать в коллекции Дома). Так делать не надо. Добавлять в коллекцию нужно в другом классе. Shocker.ProЭкземпляр наследника Человека должен знать имя поля, которому он присвоен - один из экземпляров Мужика в Хибаре знает, что его в данном случае зовут "дедушка" Зачем, если Код: c# 1.
итак все известно, ху из ху ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 15:35 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
PallarisShocker.Proтогда жилец сам себя сможет зарегистрировать в коллекции Дома).Так делать не надо. Добавлять в коллекцию нужно в другом классе.как именно? создавать какой-то третий класс? Не очень понял. PallarisЗачем, если Код: c# 1.
итак все известно, ху из хуКак экземпляру GrandPa получить строку "newHuman"? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 15:51 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.Pro[ PallarisЗачем, если Код: c# 1.
итак все известно, ху из хуКак экземпляру GrandPa получить строку "newHuman"? this, не? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 15:56 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
еще раз, мне нужно получить переменную типа string, внутри которой будет находиться строка "newHuman". Alex Kuznetsov, плиз, подскажите на примере, как это можно сделать через this ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:01 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.Proкак именно? создавать какой-то третий класс? Не очень понял. Код: c# 1. 2. 3.
Как экземпляру GrandPa получить строку "newHuman"? Зачем "newHuman"? Ну впрочем Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:04 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Ну и про имя - добавить к классу Human поле Код: c# 1.
это ж самые азы, в чем трудность-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:06 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Pallaris, прочти пожалуйста то, что я написал в первом посте в разделе "Навскидку получается:" Азы понятны. Я предполагаю, что существует какой-то иной вариант всей архитектуры, который решает четыре изложенных Задачи, а не одну из них. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:10 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
PallarisShocker.Proкак именно? создавать какой-то третий класс? Не очень понял. Код: c# 1. 2. 3.
дело в том, что жилец, это должно быть поле класса Cottege и иметь конкретный тип GrandPa, а не просто входить в коллекцию элементов типа Human. Мне нужно будет работать и со специфическими методами класса GrandPa PallarisЗачем "newHuman"? Ну впрочем Код: c# 1. 2. 3. 4. 5.
мы не обсуждаем вопрос "зачем". Класс "GrandPa" должен знать имя поля, которому его присвоили при создании. Понятно, что можно передать эту строку в конструктор, может есть еще варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:15 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.Pro]дело в том, что жилец, это должно быть поле класса Cottege и иметь конкретный тип GrandPa, а не просто входить в коллекцию элементов типа Human. В методе AddResident присваивай, как хочешь и куда хочешь Мне нужно будет работать и со специфическими методами класса GrandPa Читаем про полиморфизм Понятно, что можно передать эту строку в конструктор, может есть еще варианты? Можно в конструкторе, можно потом присвоить, можно вообще не использовать никаких строк - дедушек может ведь быть 0, 1, 2 - это ты собираешься делать поля GrandPa1, GrandPa2, GrandPa3 для Cottege? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:21 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.ProНавскидку получается: Создать в Дом коллекцию, в которую будут добавляться экземпляры жильцов по мере создания экземпляров. В конструктор экземпляра жильца передавать ссылку на класс-создатель (тогда жилец сам себя сможет зарегистрировать в коллекции Дома), а также передавать в конструктор имя поля. Не нравится в этом подходе громоздкость конструктора жильцов и двойное хранение ссылки на экземпляр. Возможно, у меня не хватает опыта, чтобы создать более красивый и правильный вариант. Экземпляр жилец должен иметь следующие поля: 1. Ссылка на дом 2. Ссылка на человека 3. Название человека в доме т.о. Конструктор: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 16:57 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
pation, Да это все понятно. Я хотел избежать громоздкого конструктора при вызове жильцов, потому что таких вызовов в доме будет достаточно много. Но, видимо, вариант только прямолинейный... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 17:18 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
PallarisAddResidentвидимо, сделаю именно так ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 17:31 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Перечисление всех полей нужного типа Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 17:33 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.Proеще раз, мне нужно получить переменную типа string, внутри которой будет находиться строка "newHuman"... Что есть newHuman - это ссылка на объект, ссылка по определению не имеет имени, т.к. это просто адрес памяти... Поэтому без введения отдельного поля в класс Human (либо его потомков) никак не получить то, что Вы хотите. PS. А что такого напряжного в том, чтобы добавить параметр в конструктор, или сделать поле в классе, которое будет содержать то, что Вам нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 19:20 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.Propation, Да это все понятно. Я хотел избежать громоздкого конструктора при вызове жильцов, потому что таких вызовов в доме будет достаточно много. Но, видимо, вариант только прямолинейный...Ну и сделайте в классе Human абстрактный метод, который будет возвращать имя потомка(но не имя переменной объекта, т.к. мы же помним что такое объект, да?). А реализовывать этот метод будут потомки: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 19:27 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Alex KuznetsovЧто есть newHuman - это ссылка на объект, ссылка по определению не имеет имени, т.к. это просто адрес памяти...С одной стороны твоя правда. С другой стороны тут я могу получить имя. Через рефлексию по идее тоже, ведь класс публичный - его поля тоже. Так что это не совсем адрес памяти. TamozhnyaПеречисление всех полей нужного типаБольшое спасибо, задавая вопрос, я как раз ожидал подобных ответов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2014, 19:59 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Shocker.ProAlex Kuznetsovskiped...С одной стороны твоя правда. С другой стороны тут я могу получить имя. Через рефлексию по идее тоже, ведь класс публичный - его поля тоже. Так что это не совсем адрес памяти. Ну что-же, если сможете получить имя ПЕРЕМЕННОЙ, то вперёд ... только потом код не забудьте показать... А особенно меня удивят имена объектов(переменных) в массиве оных... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2014, 09:43 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Смешались в кучу люди, кони.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2014, 09:47 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
PallarisСмешались в кучу люди, кони..Это про что? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2014, 09:51 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Alex KuznetsovPallarisСмешались в кучу люди, кони..Это про что? Про задачу топикстартера ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2014, 10:49 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
Alex KuznetsovА особенно меня удивят имена объектов(переменных) в массиве оных...у меня так получается, что это две разных сущности по идее, есть поле, а есть некий ключ - название поля (который участвует в некоторых сериализациях и т.п.). Но по соглашению для удобства имя поля и имя этого ключа совпадают, поэтому я и рассмотрел вопрос получения имени поля... Впрочем, я сейчас склоняюсь-таки к варианту отказаться от полей и оставить только коллекцию, где ключ будет выполнять свое прямое назначение, тогда смеси коней-людей не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2014, 11:01 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
PallarisAlex Kuznetsovпропущено... Это про что? Про задачу топикстартераАаа, ну так-то да... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2014, 11:28 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2014, 19:33 |
|
C# архитектура нескольких классов
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2014, 21:41 |
|
|
start [/forum/topic.php?fid=20&msg=38589659&tid=1403105]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
400ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 826ms |
0 / 0 |