4

[编辑]

由于比原始帖子所需的复杂性要多一些——对此我深表歉意——我将尝试简化一些事情。

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

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 方法,因为我的类没有实现 IValidatableObject。我现在覆盖该方法的正确方法是什么?

4

4 回答 4

0

我想我已经足够回答这个问题了,并决定用这里提供的更简单的版本再试一次——这个

感谢所有回复的人。管理员可以关闭此线程或将其瞄准/链接到新问题吗?我不确定在这样的情况下 SO 网络礼节是什么。

于 2012-12-18T05:45:03.410 回答
0

我可能完全错过了这一点,但这对我来说编译得很好(使用 stub 类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();
    }
}
于 2012-12-17T17:46:55.000 回答
0

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

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
于 2012-12-17T17:47:29.260 回答
0

一些事情 :

1.

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

2.

让我们假设在您的基类中有一些实际继承的方法。在那种情况下,我认为用 Virtual 关键字标记基类的接口成员并在派生类中将其标记为新成员应该不会有问题。

--

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

请提及您面临的确切问题?是您无法使用新关键字还是您正在寻求不同的方法来解决这种情况。

于 2012-12-18T14:24:43.897 回答