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); // это не нужно, не дело фундамента ставить флаги
}
}
Комментариев нет:
Отправить комментарий