实际上,我想要理解为什么这在C#中是不可能的:
class Foo{
public Bar Property {get;set;}
}
class Boo : Foo{
public override Baz Property {get;set;}
}
class Bar{
//some internal stuff
}
class Baz : Bar{
//more stuff
}对我来说,这似乎在大多数情况下都有非常明确的行为定义,只要Baz类不对Bar类隐藏成员(使用new或其他什么)。编译器会知道这是否会发生,所以这看起来不是什么问题。
我也知道这可以通过抽象类来实现,但我特别想更好地理解为什么在非抽象类的情况下不允许这样做。
发布于 2020-08-27 15:56:34
假设有人在使用你的代码:
Foo f = new Boo();由于引用的类型为Foo,因此我们只能假定Property的类型为Bar。所以我们现在也可以这样写:
f.Property = new Boz(); // assuming Boz also derives from Bar这肯定不是你真正想要的。
发布于 2020-08-27 16:09:27
您可以使用以下解决方法来解决这个问题,但是在Boo类中创建Foo泛型接口并实现它
interface IFoo<T> where T : Bar
{
public T Property { get; set; }
}
class Boo : IFoo<Baz>
{
public Baz Property { get; set; }
}还有一个covariant return types,计划在C# 9中使用,但它只能处理只读属性
https://stackoverflow.com/questions/63611369
复制相似问题