我有以下基类:
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
......
然后我们处于一个很好的循环中,警告告诉你做某事,编译器告诉你不要这样做。
当然,我会听编译器,但是如何修复警告呢?我不喜欢建立我的项目,并且出现了很多警告。
感谢您的时间。
答案 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; }
}
我怀疑如果你介绍一个中级课程,你可能会有其他选择去隐藏房产,但这几乎肯定会更加丑陋。