繁体   English   中英

从显式实现接口的基类重写方法

[英]Override a method from a base class that explicitly implements an interface

[编辑]

由于比原始帖子所需的复杂性稍微复杂一点 - 我为此道歉 - 我会尝试简化一些事情。

最初,我有一个基类,看起来像这样:

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。 现在对我来说覆盖那个方法的正确方法是什么?

我可能完全OurResources这一点,但这对我编译很好(使用了OurResourcesIntlViewModelBase<T>存根类)。

public class OurViewModel : IntlViewModelBase<OurResources>, IValidatableObject
{
    public bool Validate(ModelStateDictionary modelState)
    {
        throw new NotImplementedException();
    }

    IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
    {
        throw new NotImplementedException();
    }
}

public class MyViewModel : OurViewModel
{
    public new bool Validate(ModelStateDictionary modelState)
    {
        throw new NotImplementedException();
    }
}

如果要覆盖新的Validate方法(IValidatableObject.Validate),只需添加virtual关键字即可。

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

我想我已经充分利用了这个问题,并决定再试一次这里提供的更简单的版本 - 这个

感谢所有回复的人。 管理员是否可以关闭此主题或将其指向/链接到新问题? 我不确定在这种情况下SO礼仪是什么。

一些事情 :

1。

如果你的基类中的每个方法都希望在派生类中有新的实现,那么从base派生就没有意义了。 继承的主要目的是代码重用。 所以你可以简单地删除父子关系。

2。

让我们假设在你的基类中有一些实际上继承的方法。 在那种情况下,我不应该有一个问题,用Virtual关键字标记Base类的Interface成员,并在派生类中将其称为new。

-

如果您询问实现这种情况的不同方式,那么我们需要知道您的目标是什么。 如果目标是让派生成员具有新定义,那么更好的方法是在派生类中显式实现接口。

请提及您遇到的确切问题? 是因为您无法使用新关键字,或者您正在寻求不同的方法来解决这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM