Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
1

Как описать простые объекты?

25.08.2016, 15:36. Показов 1315. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Например:
- женщины, мужчины (с именем, фамилией, датой рождения и тд)
- они могут, жениться, например
- они могут иметь детей
- одним методом получаем объекты детей, супругов
Ну и имеется реестр, который и имеет методы, по женитьбе, беременности и тд.

Добавлено через 29 минут
Допустим я создам класс Human. Как мне описывать все объекты (женщин, мужчин, детей)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2016, 15:36
Ответы с готовыми решениями:

Создать приложение, рисующие простые графические объекты
и еще задание. помогите кто чем может. спасибо!

DirectX: Как динамически создавать простые 3d объекты
Добрый день! Помогите, пожалуйста! Как создать приложение на Visual C# с использованием DirectX? ...

Простые объекты
Простая задача для тех, кто разбирается в объектно-ориентированном программировании. Объект -...

Даны три простые дроби, описать их как записи. Найти их произведение и сократить
Даны три простые дроби, описать их как записи. Найти их произведение и сократить.Pascal

20
Заблокирован
25.08.2016, 15:39 2
Унаследуйся от него.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
25.08.2016, 15:50 3
Как производные классы. Только зачем ребёнка описывать отдельным классом, что будем делать, когда он вырастет, восходящее преобразование? Я бы вообще не делил на женщин и мучжин, а просто поставил флаг для пола, но раз ТЗ такое.
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
class Human
{
 string name;
 string surname;
 Date birthday;
}
class Man: Human
{
 
}
class Woman : Human
{
 bool is_pregnant = false;
}
class Marrieds
{
 Human woman;
 Human man;
 public Marrieds(Human woman, Human man)
 {
  this.woman = woman;
  this.man = man;
 }
}
class Registry
{
 List<Marrieds> marrieds_list = new List<Marrieds>();
 bool marry(Human woman, Human man)
 {
  // проверяем условия, будь у нас флаг пола, можно было бы запретить гей браки :)
  // если что то не так, возвращаем false
  // если всё ок, добавляем в список
  marrieds_list.Add(new Marrieds(woman, man));
  return true;
 }
}
И ко всему этому конструкторы и т.д., думаю идея ясна.

Добавлено через 1 минуту
Детей тоже надо хранить во внешнем списке.
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
25.08.2016, 15:55 4
Цитата Сообщение от nimazzzy Посмотреть сообщение
Унаследуйся от него.
Можно и не наследоваться.

Цитата Сообщение от jestero Посмотреть сообщение
Допустим я создам класс Human. Как мне описывать все объекты (женщин, мужчин, детей)?
Создай свойства в классе для каждого из признаков:
1) bool IsWoman
2) string Name
3) string Surname
4) string Patronymic
5) DateTime Birthday

Для "хранения детей" также создай свойство коллекцию 6) ICollection<Human> Children

Для указания супруга создай свойство 7) Human Partner
0
11 / 11 / 9
Регистрация: 23.04.2013
Сообщений: 81
25.08.2016, 15:57 5
ну если заморачиваться и считать, что у детей тоже могут быть дети, как-то примерно так можно:
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
62
63
64
65
66
67
68
        public static string Wedding(Human wife, Human husband)
        {
            if (wife.Sex == husband.Sex)
            {
                return "Однополые браки в России запрещены!";
            }
 
            wife.Partner = husband;
            husband.Partner = wife;
 
            return string.Format("Поздравляем {0} и {1} со свадьбой", wife.FullName, husband.FullName);
        }
 
        public static string ChildBirhday(Human parent, Human child)
        {
            var partner = parent.Partner;
 
            child.Parents = new Tuple<Human, Human>(parent, partner == null ? null : partner);
 
            if (parent.Sex == Sexs.Men || partner == null) child.LastName = parent.LastName;
            else
                child.LastName = parent.Partner.FirstName;
 
            if (parent.Childs == null) parent.Childs = new List<Human>();
            parent.Childs.Add(child);
 
            if (partner != null)
            {
                parent.Partner.Childs = parent.Childs;
 
                return string.Format("У {0} и {1} родился {2}", parent.FullName, parent.Partner.FullName, parent.Childs.Last().FullName);
            }
            else return string.Format("У {0} родился {1} (родитель-одиночка)", parent.FullName, parent.Childs.Last().FullName); 
        }
 
        static void Main(string[] args)
        {
            Human men = new Human() { FirstName = "Vasya", LastName = "Ivanov", Sex = Sexs.Men };
            Human women = new Human() { FirstName = "Varya", LastName = "Sidorova", Sex = Sexs.Women };
 
            Console.WriteLine(Wedding(women, men));
 
            Console.WriteLine(ChildBirhday(men, new Human() { FirstName = "Gena", Sex = Sexs.Men }));
        }
    }
 
    public class Human
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
 
        public string FullName { get { return FirstName + " " + LastName; } }
 
        public DateTime BirthDate { get; set; }
 
        public Sexs Sex { get; set; }
        public List<Human> Childs { get; set; }
 
        public Tuple<Human, Human> Parents { get; set; }
 
        public Human Partner { get; set; }
    }
 
    public enum Sexs
    {
        Men,
        Women
    }
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
25.08.2016, 16:02 6
Детей тоже надо хранить во внешнем списке.
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
Создай свойства в классе для каждого из признаков:
1) bool IsWoman
2) string Name
3) string Surname
4) string Patronymic
5) DateTime Birthday
Отчасти согласен, но если у нас мужчина сможет иметь флаг беременности, будет странно)
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
Для "хранения детей" также создай свойство коллекцию 6) Human Children
Когда(если?) программа будет переноситься на реальную базу данных будут сложности.
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
Для указания супруга создай свойство 7) Human Partner
и придётся следить за целостностью данных, когда мужчина говорит что A - его жена, а она это напрочь отрицает.

Добавлено через 3 минуты
Цитата Сообщение от dark94 Посмотреть сообщение
C#
1
2
3
4
if (wife.Sex == husband.Sex)
{
  return "Однополые браки в России запрещены!";
}
поменяйте на throw new MizulinaException("Однополые браки в России запрещены!");
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
25.08.2016, 16:21 7
Цитата Сообщение от DevAlone Посмотреть сообщение
Когда(если?) программа будет переноситься на реальную базу данных будут сложности
Какие сложности будут?
Если будет использоваться Code First подход, никаких сложностей не вижу. Все для этого подготовлено.

Цитата Сообщение от DevAlone Посмотреть сообщение
Отчасти согласен, но если у нас мужчина сможет иметь флаг беременности, будет странно)
Да, странно, можно за миллионом баксов бежать.

Цитата Сообщение от DevAlone Посмотреть сообщение
и придётся следить за целостностью данных, когда мужчина говорит что A - его жена, а она это напрочь отрицает.
Опять же, Code First предполагает такие навигационные свойства.
Если забыть про БД, то следить за целостностью здесь должен упомянутый автором реестр. Ничего критичного в этом не вижу.

DevAlone, все Ваши замечания вполне к месту. Всегда приходится выбирать между простотой реализации и использования, и логической корректностью модели.
1
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
25.08.2016, 17:00  [ТС] 8
Цитата Сообщение от DevAlone Посмотреть сообщение
marrieds_list.Add(new Marrieds(woman, man));
Не подскажете, что такое Add?
0
Заблокирован
25.08.2016, 17:02 9
jestero, https://msdn.microsoft.com/en-... .110).aspx
Достаточно посмотреть на класс объекта, на имя метода. Загуглить C# имя_класса имя_метода. Профит.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.08.2016, 17:14 10
Возможно стоит наследоваться, возможно все стоит пихать в один класс. Зависит от полета фантазии и задачи.

Цитата Сообщение от DevAlone Посмотреть сообщение
Отчасти согласен, но если у нас мужчина сможет иметь флаг беременности, будет странно)
А если таких флагов не будет получится ненужная иерархия, которая внесет только сложность.
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
25.08.2016, 17:18  [ТС] 11
Цитата Сообщение от nimazzzy Посмотреть сообщение
https://msdn.microsoft.com/en-us/library/3wcytfd1(v=vs.110).aspx
Написано, что добавляет объект в конец очереди List. В данном случае это важно?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
25.08.2016, 17:23 12
Цитата Сообщение от jestero Посмотреть сообщение
Написано, что добавляет объект в конец очереди List.
List это не очередь, это список. Как-бы два разных контейнера.
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
25.08.2016, 17:27  [ТС] 13
А как можно организовать поиск?
Найти людей по имени, фамилии, женатых, с детьми, родителей ребёнка, детей родителя, супруга.
У List есть какой нибудь метод?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
25.08.2016, 17:30 14
Цитата Сообщение от jestero Посмотреть сообщение
У List есть какой нибудь метод?
Есть технология LINQ, которая может в коллекциях типа List искать совпадения с заданным условием, например найти в списке людей Васю:
C#
1
2
List<Human> humans; // где-то тут создаётся список людей
Human vasya = humans.Where(x => x.name == "Вася").First();
1
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
25.08.2016, 17:49  [ТС] 15
Цитата Сообщение от aquaMakc Посмотреть сообщение
Human vasya = humans.Where(x => x.name == "Вася").First()
Что значит First() ?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
25.08.2016, 17:51 16
Цитата Сообщение от jestero Посмотреть сообщение
Что значит First() ?
Цитата Сообщение от jestero Посмотреть сообщение
Не подскажете, что такое Add?
Так плохо с английским?
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
25.08.2016, 19:07 17
Цитата Сообщение от Psilon Посмотреть сообщение
А если таких флагов не будет получится ненужная иерархия, которая внесет только сложность.
Как вариант сделать абстрактный класс Human, который будет описывать сферического человека в вакууме и иметь флаг беременности, но геттеры и сеттеры будут только у наследника Woman.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.08.2016, 19:44 18
DevAlone, в чем проблема сделать класс Human вообще без этого флага, а определить его в производном классе? Что если нам вообще не нужен этот флаг, а нам достаточно НЕ-абстрактного класса, у которого всего лишь будет свойство Sex?

Наследование становится удобным только если у нас есть куча проверок if (x.Sex == Sex.Male) {...}else{...}. Если таких проверок нет, то и наследование не нужно. А нужны ли эти проверки определяется тем, какая работа происходит с данными. Если данные гомогенные (мы никогда не проверяем этот флаг, а просто показываем его на интерфейсе), то иерархия не нужна, если гетерогенные (и мы постоянно в коде проверяем различные условия и в заисимости от этих проверок поведение разное), то нужна иерархия.

Проблема в том, что иерархия всегда добавляет сложность. Поэтому принцип KISS фактически говори о том, что вы должны ДОКАЗАТЬ необходимость наличия производных классов, в противном случае успокоившись на написании одного простого Human с 1.5 свойствами.

Хорошая статья "Как программисты хлеб пекли", немного грубовато написано, но по сути: сложность нужно вносить постепенно, трансформируя код, а не заложив в него сразу гибкость на все случаи жизни (иначе получите пример как в статье, на которую ссылаются в тексте):
Миниатюры
Как описать простые объекты?  
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
25.08.2016, 19:57  [ТС] 19
Цитата Сообщение от aquaMakc Посмотреть сообщение
Так плохо с английским?
Не в плане перевода, а в плане работы в программе.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
25.08.2016, 22:48 20
Цитата Сообщение от Psilon Посмотреть сообщение
Что если нам вообще не нужен этот флаг, а нам достаточно НЕ-абстрактного класса, у которого всего лишь будет свойство Sex
а как человек будет знать, что он беременный? Где-то это информация должна храниться.
Инетересная статья. Вообще, моё мнение, что сложность нужна тогда, когда она оправдана функциональностью, если что-то можно сделать проще и оно будет делать тоже самое, то зачем усложнять? Паттерны не изучал, может моё мнение ещё изменится)
0
25.08.2016, 22:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2016, 22:48
Помогаю со студенческими работами здесь

Использование классов в С++. Простые объекты.
Задание: Описать объект, включающий заданные поля и методы. Написать программу, которая создает...

Описать объекты Периодичность, Статья, Автор
Буду очень благодарен за помощь))) Тип «Периодичность» определить как перечисление (enum) со...

Объекты. Описать тип объекта - вектор
Задание: Описать тип объекта, который содержит: поля: вектор, его размер и его идентификатор в...

Как уничтожать динамические объекты и вообще объекты, если это необходимо сделать в их процедурах?
Создать отдельную процедуру CloseObject(Object: TObject) и вызывать ее в конце процедуры или так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru