关于向上转型、继承和设置 属性 使用 object 初始值设定项的概念

Concept regarding Upcasting, Inheritance and setting property using object initializer

问题的标题可能看起来令人困惑,但请耐心等待,我会尽可能清楚地解释问题。

所以我刚刚从一门课程中学习了 Liskov 替换原则,讲师给出了一个例子,显示了我们可以使用该原则解决的逻辑错误。因此,下面显示的示例是逻辑错误的问题。

(注意:即使你不 know/find 请阅读整个问题,这个例子与我上面提到的 Liskov 原则无关。我已经只是保留这个问题以供参考,以防万一有人费心回答你做错了)

矩形就是parentclass

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

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**
}

现在我们不只是用不同的方式初始化 object 吗?为什么 O/P 在那种情况下应该有所不同。与传统方法相比,我认为 object 初始化程序只是一个语法糖,当我们创建 object 并初始化它的属性时。

你说得对,它是语法糖。但是你得想好操作顺序:最后赋值,等号右边的所有操作之后。因此,带有初始化程序的第二个版本与:

Square square = new Square();
square.Width = 4;
Rectangle rcTwo = square;