猿问

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

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

我正在使用.NET框架,我非常希望能够制作一个自定义类型的页面,我的所有网站都使用它。当我试图从控件访问页面时,问题就出现了。我希望能够返回特定类型的页面,而不是默认页面。有什么办法吗?

public class MyPage : Page{
    // My own logic}public class MyControl : Control{
    public MyPage Page { get; set; }}


千万里不及你
浏览 430回答 3
3回答

慕的地10843

听起来你想要的是返回类型的协方差。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() { ... }}现在,您既可以使用重写虚拟方法的功能,也可以在使用编译时类型水族馆时获得更强的输入功能。

潇潇雨雨

将其放置在MyControl对象中将有效: public new MyPage Page {get return (MyPage)Page; set;}'您不能覆盖该属性,因为它返回一个不同的类型.但你可以重新定义它。在这个例子中不需要协方差,因为它比较简单。您所做的就是继承基本对象Page从…MyPage..任何Control你想要回来MyPage而不是Page需要重新定义Page的属性Control
随时随地看视频慕课网APP
我要回答