#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 никак не связаны, и как следствие изменения в одном никак не отображается на другом. Кроме того у вас довольно странная архитектура наследования - фундамент наследует зданию, а прораб включает в себя здание (наверное в качестве третей ноги). Тут пожалуй для фундамента следует использовать композицию, а прораба переработать в интерфейс.
Комментариев нет:
Отправить комментарий