【发布时间】:2012-12-18 05:41:11
【问题描述】:
我在重写显式实现接口的方法时遇到问题。
我有两节课。一个名为OurViewModel 的基类和一个名为MyViewModel 的继承类。他们共享一个名为 Validate 的方法,直到最近我才能够隐藏该方法的基本版本,如下所示:
public class OurViewModel
{
public bool Validate(ModelStateDictionary modelState){ return true; }
}
public class MyViewModel : OurViewModel
{
public new bool Validate(ModelStateDictionary modelState) {return false;}
}
这一切在几天前发生了变化。一个新的界面出现了--
public interface IValidatableObject
{
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
}
随后,OurViewModel 也发生了变化。我没有要求这个,但它发生了,我不得不忍受它。这个类现在看起来像这样:
public class OurViewModel : IValidatableObject
{
IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext) {..}
}
我很难弄清楚如何在 MyViewModel 中覆盖或隐藏这个重写的 Validate 方法。如果我尝试将 new 关键字放置在方法签名中(就像我最初所做的那样),我会收到编译错误。我也不能在 OurViewModel 中将 Validate 方法声明为虚拟,因为它显式地实现了一个接口。
怎么办?如果我只是使用来自 IValidatableObject 的签名在 MyViewModel 中重新实现Validate,那会隐藏 OurViewModel 中的实现,还是因为继承规则而以某种方式自找麻烦?
【问题讨论】:
-
你在这个问题上又犯了一个错误。如果基成员不是虚拟的,你不能在派生类中使它成为新的。
-
@Dhananjay 你错了...
-
@KonstantinVasilcov ,所以你的意思是如果基本成员不是虚拟的,你仍然可以让它成为新的?
-
@Dhananjay 绝对。阅读new Modifier (C# Reference)
标签: c# inheritance interface explicit-implementation