Страницы

Поиск по вопросам

суббота, 20 апреля 2019 г.

потеря значения поля C#

namespace DZ_4 { class Program { static void Main(string[] args) { TeamLeader pr1 = new TeamLeader(); pr1.Condition();//проверяем состояние стройки: построен или нет фундамент Basement bsm = new Basement(); bsm.Installation(); pr1.Condition();//проверяем состояние стройки: построен или нет фундамент (ОПЯТЬ ВОЗВРАЩАЕТ, ЧТО ФУНДАМЕНТ НЕ ПОСТРОЕН) }
class TeamLeader { public void Condition()//метод для проверки состояния строительства { House b = new House(); b.Condition();//метод для проверки постройки фундамента } }
class House : TeamLeader { private int Bsement { get; set; }
public new void Condition() { if (Bsement == 1) { Console.WriteLine("Фундамент построен"); } else { Console.WriteLine("Фундамент не построен"); } }
public void Result(int b) { Bsement = b; } }
class Basement : House { public void Installation()//отрисовка фундамента { Console.WriteLine("Солнце всходит - пора за работу!"); System.Threading.Thread.Sleep(4000);
Console.BackgroundColor = ConsoleColor.DarkBlue; Console.Clear(); for (int i = 0; i <= 50; i++) { Console.Write("_"); System.Threading.Thread.Sleep(40); } Console.WriteLine(); for (int i = 0; i <= 5; i++) { Console.Write("I"); for (int j = 0; j <= 48; j++) { Console.Write(" "); } Console.WriteLine("I"); System.Threading.Thread.Sleep(40); }
System.Threading.Thread.Sleep(100); Console.BackgroundColor = ConsoleColor.Blue; for (int i = 0; i <= 50; i++) { Console.Write("-"); System.Threading.Thread.Sleep(40); } Console.WriteLine(); Console.WriteLine("Стоп!"); Result(1);//передаем флажок об окончании строительства } } } }
При повторном вызове метода Condition() экземпляра TeamLeader pr1, после отрисовки фундамента и установки флажка об окончании строительства, метод опять возвращает 0, то есть "фундамент не построен". В чем загвоздка и как это исправить?


Ответ

Я бы сделал так:
Прораб и дом — отдельные сущности. Прорабу могут дать задание заняться домом. Фундамент тоже не является домом, никак. Дом включает в себя фундамент. Не дело главной программы создавать фундамент. И не дело фундамента устанавливать самого себя в дом.
Это выливается в такой код:
static void Main(string[] args) { House house = new House(); TeamLeader pr1 = new TeamLeader(); pr1.WorkOnHouse(house); bool hasBasement = house.Basement != null; if (hasBasement) Console.WriteLine("Фундамент есть"); else Console.WriteLine("Фундамента нет");
pr1.ConstructBasement();
hasBasement = house.Basement != null; if (hasBasement) Console.WriteLine("Фундамент есть"); else Console.WriteLine("Фундамента нет"); }
Теперь прораб.
class TeamLeader { House house; // текущая стройка // посылаем на объект public WorkOnHouse(House house) { this.house = house; } public ConstructBasement() { if (house == null) throw new InvalidOperationException("Сначала направьте на стройку"); if (house.Basement != null) throw new InvalidOperationException("Да есть уже фундамент, чё совсем ку-ку?"); Basement basement = new Basement(); basement.Construct(); // строим house.Basement = basement; } }
Теперь дом. Он простой как... угол дома!
class House { public Basement Basement { get; set; } // тут будут другие части дома }
Ну и фундамент.
class Basement { bool IsConstructed { get; private set; } = false;
public void Construct() { Console.WriteLine("Солнце всходит - пора за работу!"); // и так далее Console.WriteLine("Стоп!"); IsConstructed = true; // Result(1); // это не нужно, не дело фундамента ставить флаги } }

Комментариев нет:

Отправить комментарий