如何在处理虚拟属性时修复继承的成员隐藏警告

时间:2014-11-26 17:40:24

标签: c# .net inheritance properties override

我有以下基类:

public class OAuthRefreshToken {

     //Other properties..

     public int UserId { get; set; }
     public virtual OAuthUser User { get; set; }

}

这个派生类:

public abstract class OAuthRefreshToken<U> : OAuthRefreshToken 
         where U : OAuthUser {

     public virtual U User { get; set; }
}

我想要的是覆盖User基类中的OAuthRefreshToken属性和我的派生类中的属性。

我想添加override关键字:

public override virtual U User { get; set; }

但是这会引发编译错误,因为它是不允许的。

如果我保留代码(没有覆盖),则会出现警告,说我隐藏了继承的成员(我打算这样做)。

它告诉我如果隐藏意图使用override ......

然后我们处于一个很好的循环中,警告告诉你做某事,编译器告诉你不要这样做。

当然,我会听编译器,但是如何修复警告呢?我不喜欢建立我的项目,并且出现了很多警告。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

覆盖它时,您无法更改属性的类型。如果要更改类型,则需要隐藏方法而不是覆盖它。如果要覆盖它而不是隐藏它,则需要保持基类使用的相同类型。

答案 1 :(得分:0)

警告应该告诉你你能做什么 - 像这样(强调我的):

  

&#39; OAuthRefreshToken.User&#39;隐藏继承的成员&#39; OAuthRefreshToken.User&#39;。   要使当前成员覆盖该实现,请添加override关键字。   否则请添加新关键字。

但是,您可能希望这两个属性具有相同的值 - 因此您需要覆盖基类中的属性。

现在,存在一个问题,因为您不能拥有两个名称相同但属于同一类型的不同类型的属性...所以我建议为新版本使用不同的名称属性 - 此时您不需要使用new声明它,因为它不会隐藏任何内容。

public abstract class OAuthRefreshToken<U> : OAuthRefreshToken where U : OAuthUser
{
     public override OAuthUser User
     {
         get { return TypedUser; }
         set { TypedUser = (U) value; }
     }

     public virtual U TypedUser { get; set; }
}

我怀疑如果你介绍一个中级课程,你可能会有其他选择去隐藏房产,但这几乎肯定会更加丑陋。