[編輯]改寫從明確實現一個接口
基類的方法。由於多了幾分複雜性比需要在原來的職位 - 我的that--道歉,我會盡力和簡化的東西一點點。
本來我有一個基類,看起來像這樣:
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,但我無法弄清楚如何做到這一點與目前的安排。有沒有很好的方法來解決這個問題?
(FWIW,我同意增加一個新的接口基類是不應該做的事情的最佳方式,但它是怎麼在這裏發生的事情。)
[原帖]
我無法在我的一個類中重寫某個方法。有人改從這個基類的繼承模型:
public class OurViewModel : IntlViewModelBase<OurResources>
這樣:
public class OurViewModel : IntlViewModelBase<OurResources>, IValidatableObject
IValidatableObject有一個單一的方法簽名,Validate()
:
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
OurViewModel
了驗證方法看起來像:
public bool Validate(ModelStateDictionary modelState)
...現在是該改變後:
IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
我的課,同時,從OurViewModel
繼承。它使用new
關鍵字來實現它自己的驗證布爾版本。
看來我不能再隱藏Validate方法,因爲我的類沒有實現IValidatableObject。現在對我來說重寫這種方法的正確方法是什麼?
看起來你不能覆蓋該方法。它不是「虛擬」的。 –
我在我的方法中使用了'new'關鍵字來暗示我自己的版本 - 也許我不應該在我的描述中使用'override'這個詞。這次我似乎無法使用'new',所以這聽起來像我必須使基本方法變爲虛擬? – larryq
@larryq所以你想使用'IValidatableObject'的'Validate'的基類的實現,還是你想使用你自己的?另外,你是否有權修改基類? – Servy