关于向上转型、继承和设置 属性 使用 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;
问题的标题可能看起来令人困惑,但请耐心等待,我会尽可能清楚地解释问题。
所以我刚刚从一门课程中学习了 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;