我试图理解基本的继承和多态概念。但是我陷入了一种情况。
请考虑以下代码:
接口: -
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;。可能是,我可以使用铸造修复它。没有铸造可以吗?
答案 0 :(得分:4)
您可以使用
将IObject
接口声明为协变
public interface IObject<out T>
{
T Value { get; }
}
协变意味着您可以将实现IObject<Derived>
的对象分配给IObject<Base>
类型的变量。可以找到文档here。
如果没有明确指定协方差,则MyObject<Square>
为IObject<Square>
,但不能将其分配给IObject<IShape>
类型的变量。