我在这里闻到了代码的味道。我认为,如果您要实现该基类的所有功能,则应该只继承该基类。您所做的并不能真正正确地代表面向对象的原则。因此,如果你想从你的基础继承,你应该实现 Name,否则你的继承方式是错误的。您的类 A 应该是您的基类,如果这是您想要的,您当前的基类应该从 A 继承,而不是相反。
但是,不要偏离直接问题太远。如果您确实想无视“规则”并想继续您选择的道路 - 您可以这样做:
约定是实现该属性,但在调用该属性时抛出 NotImplementedException - 不过,我也不喜欢这样。但这是我个人的看法,这并不能改变这个公约仍然有效的事实。
如果您试图废弃该属性(并且它在基类中声明为虚拟),那么您可以在其上使用 Obsolete 属性:
[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
(编辑:正如 Brian 在评论中指出的那样,如果有人引用 Name 属性,属性的第二个参数将导致编译器错误,因此即使您在派生类中实现了它,他们也无法使用它。 )
或者正如我提到的使用 NotImplementedException:
public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
但是,如果该属性未声明为虚拟属性,则可以使用 new 关键字来替换它:
public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
您仍然可以使用 Obsolete 属性,就像方法被覆盖一样,或者您可以抛出 NotImplementedException,无论您选择哪种方式。我可能会使用:
[Obsolete("Don't use this", true)]
public override string Name { get; set; }
或者:
[Obsolete("Don't use this", true)]
public new string Name { get; set; }
取决于它是否在基类中被声明为虚拟。