为什么使用具有接口参数的构造函数而不是具有最多派生参数类型的构造函数?

时间:2019-02-08 11:09:20

标签: c# polymorphism

我在我们的代码中遇到了一个问题,其中某些信息正在消失。我确实找到了解决方法,但是我不太了解这种行为。为了简单起见,我举了一个例子:

常用界面

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实例。

1 个答案:

答案 0 :(得分:0)

从列表中检索f时,它的类型为IFruit,因为您将列表声明为List<IFruit>。调用f => new Apple(f)时,您使用的是IFruit而不是具体类型的Apples构造函数。

如果您要从列表中显式转换Apple,则可以完全访问所有具体类型属性。