我有以下基类:
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; }
}
我怀疑,如果你引入一个中间类,可能会有替代方案,你可以回到隐藏属性,但这几乎肯定会更丑陋。