通用接口和类/向上转换不起作用

时间:2018-05-26 06:04:16

标签: c# inheritance polymorphism

我试图理解基本的继承和多态概念。但是我陷入了一种情况。

请考虑以下代码:

接口: -

public interface IObject<T>
{
    T Value { get; }
}

实现: -

public class MyObject<T> : IObject<T>
{
    private T value;

    public MyObject(T value)
    {
        this.value = value;
    }

    public T Value => value;
}

public class SquareObject : MyObject<Square>
    {
        public SquareObject(Square square) : base(square)
        {

        }
    }

帮助程序类和接口: -

public interface IShape
{

}

public abstract class Shape : IShape
{
    public abstract int Area();
}

public class Square : Shape
{
    int length;

    public Square(int len)
    {
        length = len;
    }

    public override int Area()
    {
        return length * length;
    }
}

我的问题是,当我将方形物体铸造成形状时,它的工作正常。

IShape shape = new Square(5);

但是当我使用MyObject泛型类做同样的事情时,它不起作用。

var square = new Square(5);
IObject<IShape> gShape = new MyObject<Square>(square);

它说&#34;不能隐式地将类型MyObject<Square>转换为IObject<IShape>&#34;。可能是,我可以使用铸造修复它。没有铸造可以吗?

同样,我也无法使用SquareObject类做同样的事情。

var square = new Square(5);
IObject<IShape> shapeObj = new SquareObject(square);

它说&#34;不能隐式地将类型SquareObject转换为IObject<IShape>&#34;。可能是,我可以使用铸造修复它。没有铸造可以吗?

1 个答案:

答案 0 :(得分:4)

您可以使用

IObject接口声明为协变
public interface IObject<out T>
{
    T Value { get; }
}

协变意味着您可以将实现IObject<Derived>的对象分配给IObject<Base>类型的变量。可以找到文档here

如果没有明确指定协方差,则MyObject<Square>IObject<Square>,但不能将其分配给IObject<IShape>类型的变量。