c# - 覆盖/隐藏显式实现的接口(interface)方法

标签 c# inheritance interface explicit-implementation

我在重写显式实现接口(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/

相关文章:

json - 如何在 Go 中导航具有未知结构的嵌套 json?

java - 将多继承 C++ 代码移植到 Java

php - PHP 中类抽象和对象接口(interface)的区别?

c# - 将 Odata 查询参数添加到 @html.Routelink

swift - 在 Swift 中进行子类化时理解 init()

JavaFX 在 EventHandler 中使用父类(super class)

javascript - 使用 John Resig 的 "simple JavaScript inheritance"如何调用 super 方法以及方法中的额外代码?

c# - 如何使用 C# 获取运行代码的操作系统的名称?

c# - 如何在 gRPC 和 ASP Net Core 3.0 中使用 ssl 证书?

c# - WPF UI 动画库