Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 55

Наследование конструкторов. Код не проходит тест

01.04.2020, 10:26. Показов 932. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем привет и доброго здоровья!
Вопрос связан с наследованием конструкторов. Задача очень интересная, но как реализовать последнее условие теста, не знаю. В коде ниже комментариями обозначу предположительные места ошибок, а так же, где, по-моему, должны стоять условия, ловящие исключения.


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
using System;
sealed public class Adam : Male
{
  private static Adam Instance;
//Согласно тесту, последним двум параметрам запрещено хранить значение null
  private Adam() : base("Adam", default(Female), default(Male)) { }
  public static Adam GetInstance()
  {
    if(Instance == null)
      Instance = new Adam();
    return Instance;
  }
}
//Согласно тесту, последним двум параметрам запрещено хранить значение null
sealed public class Eve : Female
{
  private static Eve Instance;
  private Eve() : base("Eve", default(Female), default(Male)) { }
  public static Eve GetInstance(Adam adam)
  {
      if(Instance == null)
      {
          if (adam == null)
              throw new ArgumentNullException();
          Instance = new Eve();
      }
      return Instance;
  }
}
//согласно условию теста, этот класс должен иметь только один конструктор и иметь три параметра
public class Male : Human 
{
    public Male(string name, Female mother, Male father) : base(name, mother, father)   
    {
    }
} 
//согласно условию теста, этот класс должен иметь только один конструктор и иметь три параметра
public class Female : Human 
{
    public Female(string name, Female mother, Male father) : base(name, mother, father)
    {
    }
}
public abstract class Human 
{
    public Male Father;
    public Female Mother;
    public string Name;
    public Human(string name, Female mother, Male father)
    {
       //Возможно тут должен храниться код, выбрасывающий исключение, возможно использовать try/catch
       // if(mother == null || father == null)
              //throw new ArgumentNulException();
        Name = name;
        Father = father;
        Mother = mother;
    }
}
И вот этот юнит-тест не работает. Что следует добавить, чтобы код заработал так, чтобы тест прошел?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Test]
    public void Father_and_mother_are_essential_for_reproduction()
    {
        // There is just 1 way to reproduce 
        Assert.AreEqual(1, typeof(Male).GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
          .Where(x => x.IsPublic || x.IsAssembly).Count());
        Assert.AreEqual(1, typeof(Female).GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).
          Where(x => x.IsPublic || x.IsAssembly).Count());
        
        var adam = Adam.GetInstance();
        var eve = Eve.GetInstance(adam);
        Assert.Throws<ArgumentNullException>(() => new Male("Seth", null, null));
        Assert.Throws<ArgumentNullException>(()=> new Male("Abel", eve, null));
        Assert.Throws<ArgumentNullException>(() => new Male("Seth", null, adam));
        Assert.Throws<ArgumentNullException>(() => new Female("Azura", null, null));
        Assert.Throws<ArgumentNullException>(() => new Female("Awan", eve, null));
        Assert.Throws<ArgumentNullException>(() => new Female("Dina", null, adam));
        Assert.Throws<ArgumentNullException>(() => new Female("Eve", null, null));
        Assert.Throws<ArgumentNullException>(() => new Male("Adam", null, null));
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.04.2020, 10:26
Ответы с готовыми решениями:

Код не проходит тест
https://open.kattis.com/problems/runlengthencodingrun задание. Суть закодировать информация или декодировать. Например, aaassd будет...

Наследование конструкторов
если при наследовании классов отсутствует конструктор в базовом классе, то что тогда? Помогите, не могу найти ответ в инете.

Наследование конструкторов
Создать класс CPoint – точка. На его основе создать классы CColoredPoint и CLine. На основе класса СLine создать класс CcoloredLine и класс...

12
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.04.2020, 11:01
Цитата Сообщение от Traktirshik Посмотреть сообщение
Что следует добавить, чтобы код заработал так, чтобы тест прошел?
Один из вариантов — сделать классы вложенными с закрытыми конструкторами:
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
public abstract class Human
{
    public Male Father;
    public Female Mother;
    public string Name;
 
    public Human(string name, Female mother, Male father) : this(name)
    {
        if (father == null) throw new ArgumentNullException(nameof(father));
        if (mother == null) throw new ArgumentNullException(nameof(mother));
 
        Father = father;
        Mother = mother;
    }
    private Human(string name)
    {
        Name = name;
    }
 
    public class Male : Human
    {
        public Male(string name, Female mother, Male father) : base(name, mother, father) { }
        private Male(string name) : base(name) { }
 
        public sealed class Adam : Male
        {
            private Adam() : base("Adam") { }
 
            public static Adam Instance { get; } = new Adam();
        }
    }
 
    public class Female : Human
    {
        public Female(string name, Female mother, Male father) : base(name, mother, father) { }
 
        private Female(string name) : base(name) { }
 
        public sealed class Eve : Female
        {
            private Eve() : base("Eve") { }
 
            public static Eve Instance { get; } = new Eve();
        }
    }
}
Правда, последний тест все равно не пройдет, потому что вы создаете просто человека с именем Адам, а не Того Самого Адама.
0
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 55
01.04.2020, 11:20  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Правда, последний тест все равно не пройдет, потому что вы создаете просто человека с именем Адам, а не Того Самого Адама.
В том и дело, как их обоих выделить, если конструкторы на каждого человека одинаковые?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.04.2020, 11:40
Цитата Сообщение от Traktirshik Посмотреть сообщение
как их обоих выделить, если конструкторы на каждого человека одинаковые?
Что значит "выделить"?
У вас Адам и Ева (те самые) — особые сущности, реализованные через синглтон.
Тесты написаны правильно и последние должны бросать исключение, они и бросают.

В чем сейчас проблема, с учетом обновленного кода?
0
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 55
01.04.2020, 12:13  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В чем сейчас проблема, с учетом обновленного кода?
В вижле то все нормально, только по условию все классы должны быть отдельны друг от друга, то есть не вложенными

Добавлено через 4 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
В чем сейчас проблема, с учетом обновленного кода?
Все сработало!) Вынес все вложенные классы, а конструктор с одним параметром в Male/Female сделал protected.
Спасибо. Всем крепкого здоровья!
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.04.2020, 14:30
Цитата Сообщение от Traktirshik Посмотреть сообщение
все классы должны быть отдельны друг от друга, то есть не вложенными
Тогда придется вводить дополнительные слои наследования.

Цитата Сообщение от Traktirshik Посмотреть сообщение
Вынес все вложенные классы, а конструктор с одним параметром в Male/Female сделал protected.
Так можно нарушить инвариант, что у всех людей кроме Адама и Евы есть родители:
1. Наследуемся от Male.
2. Вызываем protected конструктор.
3. Профит.
0
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 55
01.04.2020, 14:56  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Так можно нарушить инвариант, что у всех людей кроме Адама и Евы есть родители:
Хм, действительно, таким образом нарушится. Только как иначе выполнить? Вложенные типы не срабатывают, а решения других участников такие же.
Получается, что это скорее недоработка задачи, или тестов?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.04.2020, 16:17
Цитата Сообщение от Traktirshik Посмотреть сообщение
Вложенные типы не срабатывают
В смысле не срабатывают?
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
01.04.2020, 16:31
Цитата Сообщение от Traktirshik Посмотреть сообщение
недоработка задачи
можно для начала узнать "что за задача" (полное описание), ибо так можно ходить вокруг да около очень долго...
0
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 55
01.04.2020, 16:44  [ТС]
Цитата Сообщение от Enifan Посмотреть сообщение
можно для начала узнать "что за задача"
Вот ссылка на задачу:
https://www.codewars.com/kata/... e43d00008f

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
В смысле не срабатывают?
Извините, при вложенных типах решение не проходит последний тест.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.04.2020, 16:48
Цитата Сообщение от Traktirshik Посмотреть сообщение
при вложенных типах решение не проходит последний тест.
Покажите обновленный код со вложенными типами.
0
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 55
01.04.2020, 16:57  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Покажите обновленный код со вложенными типами
С вложенными типами в вижле работает хорошо (это ваш код и его я не обновлял). Ваш код просто навел меня на мысль о модификаторе доступа, и я изменил свой собственный код в начале темы, добавив в классы Male/Female protected конструктор с одним параметром string name. Вот и все
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.04.2020, 17:13
Цитата Сообщение от Traktirshik Посмотреть сообщение
я изменил свой собственный код в начале темы, добавив в классы Male/Female protected конструктор с одним параметром string name. Вот и все
Дык поэтому и работать перестало — вы инварианты нарушили, вот тесты и не проходят.
Уберите добавленные конструкторы — оставьте код как в предложенном варианте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2020, 17:13
Помогаю со студенческими работами здесь

Наследование конструкторов?
Сдаю лабораторную на тему наследования в С++ : #include &lt;iostream&gt; using namespace std; class hero { protected: int jiv; ...

Наследование конструкторов
Здрасти. Такая проблема. У меня есть классы с таким наследованием: KIERUNEK--&gt;PRZEDMIOT--&gt;OCENA&lt;--STUDENT Вот конструкторы класса...

Наследование конструкторов
Здравствуйте! У меня такой вопрос: Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского? При...

Наследование конструкторов
Здравствуйте, мне нужно что бы player наследовал конструктор от aobject class aobject { public: aobject(int xx,int yy,int** mm)...

Наследование конструкторов
Вопрос по теории наследования: Есть некоторый базовый класс с двумя конструкторами типа паблик, первый без аргумента, второй с одним...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru