2

インターフェイスを明示的に実装するメソッドをオーバーライドするのに問題があります。

私は2つのクラスを持っています。と呼ばれる基本的なものと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キーワードをメソッド シグネチャに配置しようとすると(最初に行ったように)、コンパイル エラーが発生します。Validateまた、明示的にインターフェイスを実装しているため、OurViewModel でメソッドを仮想として 宣言することもできません。

何をすべきか?IValidatableObject の署名を使用して MyViewModelに単純に再実装Validateすると、OurViewModel の実装が非表示になりますか、それとも継承規則のために何らかの形で問題が発生するのでしょうか?

4

2 に答える 2

4

派生クラスでもこのインターフェイスを暗黙的に実装する必要があると思います。

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);

また、インターフェイスが明示的に実装されている場合は、インターフェイスへの参照を介してのみ実装にアクセスできます。やろうとしたら覚えておいてください

OurViewModel v = new OurViewModel();
v.Validate(null);

Validateインターフェイスの実装ではなく、クラスの元のメソッドを呼び出します。起こりうる間違いを避けるために、古い方法は削除する必要があると思います。

于 2012-12-18T05:51:26.970 に答える
0

本当にIValidatableObjectをBaseクラスに明示的に実装する必要がありますか?

解決策は次のようになります-基本クラスに暗黙的にIValidatableObjectを実装し、仮想としてマークします。

:-

次に、IValidatableObjectを派生クラスに暗黙的に実装し、仮想新規としてマークします。派生クラス定義でインターフェース名を使用することを忘れないでください。

これは、@KonstantinVasilcovによる回答と比較して少し異なるアプローチです。このアプローチを使用すると、動作をオーバーライドできるMyViewModelの派生クラスを増やすことができます。

于 2012-12-18T16:52:27.450 に答える