为了账号安全,请及时绑定邮箱和手机立即绑定

C#支持返回类型协方差吗?

C#支持返回类型协方差吗?

千万里不及你 2019-06-20 15:29:42
C#支持返回类型协方差吗?我正在使用.NET框架,我非常希望能够制作一个自定义类型的页面,我的所有网站都使用它。当我试图从控件访问页面时,问题就出现了。我希望能够返回特定类型的页面,而不是默认页面。有什么办法吗?public class MyPage : Page{     // My own logic}public class MyControl : Control{     public MyPage Page { get; set; }}
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

听起来你想要的是返回类型的协方差。C#不支持返回类型协方差。

返回类型协方差是覆盖一个基类方法的地方,该方法返回一个不太特定的类型,而返回一个更特定的类型:

abstract class Enclosure{
    public abstract Animal Contents();}class Aquarium : Enclosure{
    public override Fish Contents() { ... }}

这是安全的,因为消费者的内容通过封闭期待动物,水族馆承诺不仅满足这一要求,而且,作出更严格的承诺:动物永远是一条鱼。

这种协方差在C#中是不支持的,也不太可能被支持。CLR不支持它。(C+和CLR上的C+/CLI实现都支持它;它是通过生成我下面建议的那种神奇的助手方法来实现的。)

(有些语言也支持形式参数类型逆变-您可以用获取动物的方法覆盖接受鱼的方法。同样,契约已经完成;基类要求处理任何鱼,派生类承诺不仅处理鱼,而且处理任何动物。类似地,C#和CLR不支持形式参数类型反方差。)

解决此限制的方法是执行以下操作:

abstract class Enclosure{
    protected abstract Animal GetContents();
    public Animal Contents() { return this.GetContents(); }}class Aquarium : Enclosure{
    protected override Animal GetContents() { return this.Contents(); }
    public new Fish Contents() { ... }}

现在,您既可以使用重写虚拟方法的功能,也可以在使用编译时类型水族馆时获得更强的输入功能。


查看完整回答
反对 回复 2019-06-20
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

将其放置在MyControl对象中将有效:

 public new MyPage Page {get return (MyPage)Page; set;}'

您不能覆盖该属性,因为它返回一个不同的类型.但你可以重新定义它。

在这个例子中不需要协方差,因为它比较简单。您所做的就是继承基本对象Page从…MyPage..任何Control你想要回来MyPage而不是Page需要重新定义Page的属性Control


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 429 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信