【问题标题】:Generic Interface and Class / up casting is not working通用接口和类/向上转换不起作用
【发布时间】:2018-05-26 06:04:15
【问题描述】:

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

考虑以下代码:

界面:-

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

        }
    }

Helper 类和接口:-

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&lt;Square&gt; 隐式转换为 IObject&lt;IShape&gt;”。可能是,我可以使用强制转换来修复它。不铸造也可以吗?

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

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

它说“无法将类型 SquareObject 隐式转换为 IObject&lt;IShape&gt;”。可能是,我可以使用强制转换来修复它。不铸造也可以吗?

【问题讨论】:

    标签: c# inheritance polymorphism


    【解决方案1】:

    您可以使用

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

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


    如果不明确指定协方差,您的MyObject&lt;Square&gt;IObject&lt;Square&gt;,但它不能分配给IObject&lt;IShape&gt; 类型的变量。

    【讨论】:

    • 很好的答案,点赞。对我来说也是一个耳光时刻
    • 感谢您的回答。它就像一个魅力...... :)
    • 请注意,它会起作用,因为您在输出位置只有通用参数(带有 getter 的属性,方法返回类型)。第二个你的接口在输入位置有泛型参数(属性有一个设置器,方法参数)这将不再可能。
    • @pinkfloydx33 是的,这是一件好事,因为那样它就不再有意义了,例如将 Cat 分配给创建为 MyObject&lt;Fish&gt;IObject&lt;Animal&gt;.Value
    • @Dirk 我知道,我知道知道。我是在为 OP 大声疾呼 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多