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

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

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


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

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

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


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


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


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


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

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


итак все известно, ху из хуКак экземпляру GrandPa получить строку "newHuman"? this, не?
...
Рейтинг: 0 / 0
18.03.2014, 16:01
    #38589650
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
еще раз, мне нужно получить переменную типа string, внутри которой будет находиться строка "newHuman". Alex Kuznetsov, плиз, подскажите на примере, как это можно сделать через this
...
Рейтинг: 0 / 0
18.03.2014, 16:04
    #38589659
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
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
18.03.2014, 16:06
    #38589666
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
Ну и про имя - добавить к классу Human поле
Код: c#
1.
publis string name {set;get;}



это ж самые азы, в чем трудность-то?
...
Рейтинг: 0 / 0
18.03.2014, 16:10
    #38589673
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
Pallaris,
прочти пожалуйста то, что я написал в первом посте в разделе "Навскидку получается:"
Азы понятны.
Я предполагаю, что существует какой-то иной вариант всей архитектуры, который решает четыре изложенных Задачи, а не одну из них.
...
Рейтинг: 0 / 0
18.03.2014, 16:15
    #38589680
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
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
18.03.2014, 16:21
    #38589691
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
Shocker.Pro]дело в том, что жилец, это должно быть поле класса Cottege и иметь конкретный тип GrandPa, а не просто входить в коллекцию элементов типа Human.


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

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


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

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

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

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

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

Да это все понятно. Я хотел избежать громоздкого конструктора при вызове жильцов, потому что таких вызовов в доме будет достаточно много. Но, видимо, вариант только прямолинейный...
...
Рейтинг: 0 / 0
18.03.2014, 17:31
    #38589797
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
PallarisAddResidentвидимо, сделаю именно так
...
Рейтинг: 0 / 0
18.03.2014, 17:33
    #38589800
Tamozhnya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
Перечисление всех полей нужного типа
Код: 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
18.03.2014, 19:20
    #38589896
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
Shocker.Proеще раз, мне нужно получить переменную типа string, внутри которой будет находиться строка "newHuman"... Что есть newHuman - это ссылка на объект, ссылка по определению не имеет имени, т.к. это просто адрес памяти...
Поэтому без введения отдельного поля в класс Human (либо его потомков) никак не получить то, что Вы хотите.

PS. А что такого напряжного в том, чтобы добавить параметр в конструктор, или сделать поле в классе, которое будет содержать то, что Вам нужно?
...
Рейтинг: 0 / 0
18.03.2014, 19:27
    #38589905
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
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
18.03.2014, 19:59
    #38589928
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
Alex KuznetsovЧто есть newHuman - это ссылка на объект, ссылка по определению не имеет имени, т.к. это просто адрес памяти...С одной стороны твоя правда. С другой стороны тут я могу получить имя. Через рефлексию по идее тоже, ведь класс публичный - его поля тоже. Так что это не совсем адрес памяти.


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

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

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

Про задачу топикстартераАаа, ну так-то да...
...
Рейтинг: 0 / 0
26.03.2014, 19:33
    #38597394
Andemki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
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
26.03.2014, 21:41
    #38597476
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# архитектура нескольких классов
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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# архитектура нескольких классов / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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