【发布时间】:2012-12-04 20:15:54
【问题描述】:
[编辑]
由于比原始帖子所需的复杂性略高——对此我深表歉意——我将尝试简化一下。
最初,我有一个看起来像这样的基类:
public class OurViewModel
{
public bool Validate(ModelStateDictionary modelState){...}
}
我的类继承并隐藏了该方法,使用 new 关键字:
public class MyViewModel : OurViewModel
{
public new bool Validate(ModelStateDictionary modelState) {...}
}
同时,IValidatableObject 接口出现了:
public interface IValidatableObject
{
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
}
现在,OurViewModel(很遗憾)也发生了变化。它看起来像这样:
public class OurViewModel : IValidatableObject
{
IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext) {..}
}
我现在需要做的是再次在 MyViewModel 中隐藏 Validate 方法,但我不知道如何使用当前的安排来实现。有什么好的办法吗?
(FWIW,我同意向基类添加新接口并不是完成工作的最佳方式,但这就是这里发生的事情。)
[原帖]
我在覆盖我的一个类中的方法时遇到问题。有人从这个改变了基类的继承模型:
public class OurViewModel : IntlViewModelBase<OurResources>
到这里:
public class OurViewModel : IntlViewModelBase<OurResources>, IValidatableObject
IValidatableObject 有一个方法签名,Validate():
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
OurViewModel 有一个 Validate 方法,如下所示:
public bool Validate(ModelStateDictionary modelState)
...现在是更改后的样子:
IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
与此同时,我的类继承自 OurViewModel。它使用new 关键字来实现自己的布尔版本的Validate。
似乎我不再能够隐藏 Validate 方法,因为我的类没有实现 IValidatableObject。我现在覆盖该方法的正确方法是什么?
【问题讨论】:
-
您似乎曾经能够覆盖该方法。不是
virtual。 -
我在我的方法中使用了
new关键字来实现我自己的版本——也许我不应该在我的描述中使用“覆盖”这个词。这次我似乎无法使用new,所以听起来我必须将基本方法设为虚拟? -
@larryq 那么你是想使用
IValidatableObject的Validate的基类实现,还是你自己的?另外,您是否有权修改基类? -
new不会覆盖 - 它隐藏基类方法。 -
我知道这并不能解决您当前的问题,但这对我来说听起来像是一个流程问题。应提前提出类继承层次结构的更改,并在实施之前在整个团队中进行讨论。
标签: c# inheritance interface