gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:01:43 26 4
gpt4 key购买 nike

我在覆盖显式实现接口(interface)的方法时遇到问题。

我有两个类(class)。一个名为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com