首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么派生类不能用从原始类型派生的类型重写基类中的属性?

为什么派生类不能用从原始类型派生的类型重写基类中的属性?
EN

Stack Overflow用户
提问于 2020-08-27 15:43:10
回答 2查看 83关注 0票数 0

实际上,我想要理解为什么这在C#中是不可能的:

代码语言:javascript
复制
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或其他什么)。编译器会知道这是否会发生,所以这看起来不是什么问题。

我也知道这可以通过抽象类来实现,但我特别想更好地理解为什么在非抽象类的情况下不允许这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-27 15:56:34

假设有人在使用你的代码:

代码语言:javascript
复制
Foo f = new Boo();

由于引用的类型为Foo,因此我们只能假定Property的类型为Bar。所以我们现在也可以这样写:

代码语言:javascript
复制
f.Property = new Boz(); // assuming Boz also derives from Bar

这肯定不是你真正想要的。

票数 4
EN

Stack Overflow用户

发布于 2020-08-27 16:09:27

您可以使用以下解决方法来解决这个问题,但是在Boo类中创建Foo泛型接口并实现它

代码语言:javascript
复制
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中使用,但它只能处理只读属性

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63611369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档