3

基本クラスにIDataErrorInfoインターフェイスを実装する必要があります。インターフェイスには、プロパティとインデクサーが必要です。両方にデフォルトの実装を提供し、サブクラスがそれをオーバーライドできるようにしたいと考えています。インターフェイス実装の構文で「仮想」実装の構文を使用することはできないようです! 例えば:

type ViewModelBase() =
  interface IDataErrorInfo with
    abstract Error : string with get
    default this.Error with get() = ""

次のコンパイルエラーが発生します

エラー 1 メンバー定義に予期しないキーワード 'abstract' があります。「メンバー」、「オーバーライド」、またはその他のトークンが必要です。D:\MinorApps\VetCompass\VetCompass\ViewModel\ViewModelBase.fs 18 7 VetCompass

エラー 2 パターン D:\MinorApps\VetCompass\VetCompass\ViewModel\ViewModelBase.fs 19 7 VetCompass のこの時点またはそれ以前の不完全な構造化コンストラクト

インデクサーをどこから始めればよいかさえわかりません。

4

3 に答える 3

8

すべてのインターフェイスの実装は明示的です。つまり、インターフェイスのメソッドは、クラスのメンバーとして表示されたときにプライベートになります。abstractしたがって、実装でanddefault修飾子を使用することはできません。代わりに、少し複製を追加する必要があります。

type ViewModelBase() =
    // declare a new virtual property
    abstract Error : string
    default this.Error = ""

    interface IDataErrorInfo with
       // pass through to the virtual property implementation
       member this.Error = this.Error
于 2012-10-12T14:06:58.470 に答える
5

オブジェクト式は、多くの場合、抽象クラスや仮想メソッドの代わりに使用できます。「ファクトリ」関数に提供される引数を介して動作を制御できます。このようなもの:

type IMyInterface =
  abstract SayHello : unit -> string
  abstract Item : string -> obj with get

let makeMyInterface sayHello (lookup: IDictionary<string, obj>) =
  { new IMyInterface with
      member x.SayHello() = sayHello()
      member x.Item 
        with get name = lookup.[name] }

既存のフレームワークの慣習に制約されているため、これはおそらくあなたの場合には機能しません。しかし、状況によっては良い代替手段になる可能性があります。

于 2012-10-12T16:43:23.173 に答える
0

IDataErrorInfo と INotifyPropertyChanged を仮想実装で実装するには、次のコードを使用します。

type ViewModelBase() =
    let propertyChangedEvent = new DelegateEvent<PropertyChangedEventHandler>()

    abstract Error : string with get
    default this.Error with get() = ""

    abstract Item : string -> string with get
    default this.Item with get(name) = ""

    interface INotifyPropertyChanged with
        [<CLIEvent>]
        member x.PropertyChanged = propertyChangedEvent.Publish
    member x.OnPropertyChanged propertyName = 
        propertyChangedEvent.Trigger([| x; new PropertyChangedEventArgs(propertyName) |])

    interface IDataErrorInfo with
       // pass through to the virtual property implementation
       member this.Error = this.Error
       member this.Item with get(x) = this.Item(x)
于 2012-10-12T14:34:57.953 に答える