我在我们的代码中遇到了一个问题,其中某些信息正在消失。我确实找到了解决方法,但是我不太了解这种行为。为了简单起见,我举了一个例子:
常用界面
delete_model
2个派生类:
public interface IFruit
{
Color Color { get; set; }
}
测试代码:
public class Apple : IFruit
{
public int Radius { get; set; }
public Color Color { get; set; }
public Apple(IFruit fruit)
{
Color = fruit.Color;
}
public Apple(Apple apple)
{
Color = apple.Color;
Radius = apple.Radius;
}
public Apple(Color color, int radius)
{
Color = color;
Radius = radius;
}
public override string ToString()
{
return $"I'm a {Color.ToString()} apple with a radius of {Radius}cm";
}
}
public class Banana : IFruit
{
public int Length { get; set; }
public Color Color { get; set; }
public Banana(IFruit fruit)
{
Color = fruit.Color;
}
public Banana(Banana banana)
{
Color = banana.Color;
Length = banana.Length;
}
public Banana(Color color, int lenght)
{
Color = color;
Length = Length;
}
public override string ToString()
{
return $"I'm a {Color.ToString()} banana with a length of {Length}cm";
}
}
输出
我是半径为0厘米的红苹果
我是一个半径为0厘米的黄色苹果
我不了解的内容
请注意,红苹果失去了它的半径值。我知道香蕉会丢失其信息,但是我不明白为什么对于Apple实例,使用构造函数Apple(IFruit水果)而不是Apple(Apple apple)构造函数。这是一个苹果,它只是在基本类型的类型列表中。
我希望Banana实例使用更通用的构造函数,而不是Apple实例。
答案 0 :(得分:0)
从列表中检索f
时,它的类型为IFruit
,因为您将列表声明为List<IFruit>
。调用f => new Apple(f)
时,您使用的是IFruit
而不是具体类型的Apples构造函数。
如果您要从列表中显式转换Apple
,则可以完全访问所有具体类型属性。