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、基本クラスに新しいインターフェイスを追加することは、物事を行うための最適な方法ではないことに同意しますが、ここで起こったことです。)


【原文】

クラスの 1 つでメソッドをオーバーライドするのに問題があります。誰かがベース クラスの継承モデルを次のように変更しました。

public class OurViewModel : IntlViewModelBase<OurResources>

これに:

public class OurViewModel : IntlViewModelBase<OurResources>, IValidatableObject

IValidatableObject には、次の 1 つのメソッド シグネチャがありValidate()ます。

IEnumerable<ValidationResult> Validate(ValidationContext validationContext);

OurViewModel次のような Validate メソッドがありました。

public bool Validate(ModelStateDictionary modelState)

...そして今、これは変更後のものです:

IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)

一方、私のクラスはOurViewModel. キーワードを使用してnew、Validate の独自のブール バージョンを実装しました。

クラスが IValidatableObject を実装していないため、Validate メソッドを非表示にできなくなったようです。そのメソッドをオーバーライドする適切な方法は何ですか?

4

4 に答える 4

0

いくつかのこと :

1.

基本クラスのすべてのメソッドに対して、派生クラスに新しい実装が必要な場合は、基本から派生しても意味がありません。継承の主な目的は、コードの再利用です。したがって、親子関係を簡単に削除できます。

2.

基本クラスに、実際に継承しているいくつかのメソッドがあると仮定しましょう。その場合、基本クラスの Interface メンバーを Virtual キーワードでマークし、派生クラスでそれを new としてマークすることに問題があるとは思いません。

--

この状況を実装する別の方法について質問している場合は、あなたの目的を知る必要があります。目的が派生メンバーに新しい定義を持たせることである場合、より良い方法は、派生クラスでのインターフェイスの明示的な実装です。

あなたが直面している正確な問題について言及してください。新しいキーワードを使用できないか、この状況を解決するためのさまざまな方法を尋ねているということです。

于 2012-12-18T14:24:43.897 に答える
0

私はこの質問を十分に修正したと思い、ここで提供されているより単純なバージョンで再試行することにしました--これ

返信してくれたみんなに感謝します。管理者はこのスレッドを閉じるか、新しい質問に向けてリンクすることができますか? このような状況での SO ネチケットが何であるかはわかりません。

于 2012-12-18T05:45:03.410 に答える
0

ポイントを完全に見逃しているかもしれませんが、これは私にとってはうまくコンパイルされます( と にスタブクラスを使用しました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 に答える