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

本文关键字:继承 成员 警告 隐藏 属性 何处理 处理 虚拟 | 更新日期: 2023-09-27 18:32:11

我有以下基类:

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; }
}

我想要的是用派生类中的基类重写 OAuthRefreshToken 基类中的 User 属性。

我想添加override关键字:

public override virtual U User { get; set; }

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

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

它告诉我使用override是否打算隐藏......

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

当然,我会听编译器,但是我该如何解决警告?我不喜欢构建我的项目,并且出现了一堆警告。

谢谢你的时间。

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

重写属性时无法更改属性的类型。 如果要更改类型,则需要隐藏方法而不是重写它。 如果要重写它而不是隐藏它,则需要维护基类使用的相同类型。

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

"OAuthRefreshToken.User"隐藏继承成员"OAuthRefreshToken.User"。 若要使当前成员重写该实现,请添加 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; }
}

我怀疑,如果你引入一个中间类,可能会有替代方案,你可以回到隐藏属性,但这几乎肯定会更丑陋。