c# - 通用接口和类/向上转换不起作用
问题描述
我正在尝试理解基本的继承和多态性概念。但我陷入了一种情况。
考虑以下代码:
界面:-
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);
它说“无法将类型隐式转换SquareObject
为IObject<IShape>
”。可能是,我可以使用强制转换来修复它。没有铸造可以吗?
解决方案
您可以使用声明您的IObject
接口为协变
public interface IObject<out T>
{
T Value { get; }
}
协变意味着您可以将实现的对象分配给IObject<Derived>
类型为 的变量IObject<Base>
。文档可以在这里找到。
如果没有明确指定协方差,您MyObject<Square>
就是一个IObject<Square>
,但不能将它分配给类型的变量IObject<IShape>
。
推荐阅读
- html - 使用html在列表的每个元素中放置多个图标
- mongodb - 有没有办法将 mongodb 添加到 nativescript?
- mysql - 如何在Mysql中存储大量数据?
- reactjs - 如何在反应中设置最大用户规模?
- linux - root@0.tcp.ngrok.io:权限被拒绝(公钥,密码)
- html - daterangepicker 超过所有项目
- java - Can I format a string in 2 times in java?
- android - Android RecyclerView 相册喜欢
- google-apps-script - 如何使用 GAS 自动将所有事件从一个日历复制到另一个日历?
- java - 在 Java 中为非模块化和模块化项目在运行时添加本机库的路径