Страницы

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

среда, 12 февраля 2020 г.

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

#c_sharp


    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,
то есть "фундамент не построен". В чем загвоздка и как это исправить?
    


Ответы

Ответ 1



Я бы сделал так: Прораб и дом — отдельные сущности. Прорабу могут дать задание заняться домом. Фундамент тоже не является домом, никак. Дом включает в себя фундамент. Не дело главной программы создавать фундамент. И не дело фундамента устанавливать самого себя в дом. Это выливается в такой код: 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); // это не нужно, не дело фундамента ставить флаги } }

Ответ 2



Тут у вас ничего не теряется просто ОБЪЕКТЫ bsm и pr1 никак не связаны, и как следствие изменения в одном никак не отображается на другом. Кроме того у вас довольно странная архитектура наследования - фундамент наследует зданию, а прораб включает в себя здание (наверное в качестве третей ноги). Тут пожалуй для фундамента следует использовать композицию, а прораба переработать в интерфейс.

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

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