Название вопроса может показаться запутанным, но потерпите меня, я постараюсь объяснить проблему как можно яснее.
Итак, я только что изучал принцип подстановки Лискова из курса, и лектор привел пример, показывающий логические ошибки, которые мы можем решить, используя этот принцип. Следовательно, пример, показанный ниже, является проблемой с логической ошибкой.
(Примечание: пожалуйста, прочитайте весь вопрос, даже если вы не знаете/обнаружите, что этот пример не имеет ничего общего с принципом Лискова, как я упоминал выше. Я просто оставил этот вопрос для справки, просто на случай, если кто-то потрудится ответить, что вы делаете это неправильно)
Rectangle является родительским классом
class Rectangle
{
public int Width { get; set; }
public int Height { get; set; }
public Rectangle()
{
}
public Rectangle(int width, int height)
{
Width = width;
Height = height;
}
public override string ToString()
{
return $"{nameof(Width)}: {Width}, {nameof(Height)}: {Height}";
}
}
Квадратный класс
class Square : Rectangle
{
public new int Width
{
set { base.Width = base.Height = value; }
}
public new int Height
{
set { base.Width = base.Height = value; }
}
}
Простой вызывающий абонент
private void Caller()
{
Rectangle rc = new Square(); //Upcasting here
rc.Width = 4;
Console.WriteLine($"{rc}"); //Now here the o/p is **Width: 4, Height: 0** which is correct
//But when we use object initializer as shown below
Rectangle rcTwo = new Square { Width = 4 };
Console.WriteLine($"{rcTwo}"); //the o/p is **Width: 4, Height: 4**
}
Разве мы не просто инициализируем объект по-другому? Почему O/P должен отличаться в этом случае. Я думал, что инициализатор объекта - это просто синтаксический сахар, когда мы создаем объект и инициализируем его свойства по сравнению с традиционным подходом.