首页 > 解决方案 > 通用接口和类/向上转换不起作用

问题描述

我正在尝试理解基本的继承和多态性概念。但我陷入了一种情况。

考虑以下代码:

界面:-

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);

它说“无法将类型隐式转换MyObject<Square>IObject<IShape>”。可能是,我可以使用强制转换来修复它。没有铸造可以吗?

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

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

它说“无法将类型隐式转换SquareObjectIObject<IShape>”。可能是,我可以使用强制转换来修复它。没有铸造可以吗?

标签: c#inheritancepolymorphism

解决方案


您可以使用声明您的IObject接口为协变

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

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


如果没有明确指定协方差,您MyObject<Square>就是一个IObject<Square>,但不能将它分配给类型的变量IObject<IShape>


推荐阅读