我在重写显式实现接口(interface)的方法时遇到问题。
我有两个类。一个名为 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 方法声明为虚拟方法,因为它显式实现了一个接口(interface)。
该怎么办?如果我只是使用 IValidatableObject 中的签名在 MyViewModel 中重新实现 Validate ,这是否会隐藏 OurViewModel 中的实现,或者我是否会因为继承规则而以某种方式自找麻烦?
最佳答案
我认为您也需要在派生类中隐式实现此接口(interface)。
public class MyViewModel : OurViewModel, IValidatableObject
{
IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
{
//...
}
}
然后
OurViewModel v = new OurViewModel();
MyViewModel m = new MyViewModel();
IValidatableObject ivo = v;
ivo.Validate(null);
ivo = m;
ivo.Validate(null);
此外,如果接口(interface)是显式实现的,则您只能通过对该接口(interface)的引用来访问该实现。请记住,如果您尝试这样做
OurViewModel v = new OurViewModel();
v.Validate(null);
它将调用类的原始Validate
方法,而不是接口(interface)实现。我认为应该删除旧的方法以避免可能的错误。
关于c# - 覆盖/隐藏显式实现的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13926964/