2010-12-29 24 views
5

私はF#で次のC#のインターフェイスを実装したいと思います:F#でC#インターフェイスを実装する方法は?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Mono.Addins; 

[TypeExtensionPoint] 
public interface ISparqlCommand 
{ 
    string Name { get; } 
    object Run(Dictionary<string, string> NamespacesDictionary, org.openrdf.repository.Repository repository, params object[] argsRest); 
} 

これは私が試してみましたものですが、それは私を与える:「表現のこの時点で、または前に不完全な構造の構築物」

#light 

module Module1 

open System 
open System.Collections.Generic; 

type MyClass() = 
    interface ISparqlCommand with 
     member this.Name = 
      "Finding the path between two tops in the Graph" 
     member this.Run(NamespacesDictionary, repository, argsRest) = 
      new System.Object 

私は何が間違っていますか?たぶんインデントが間違っていますか?

+6

でMono.Addinsを使用する方法の例ですか? –

+1

C#インターフェイスとは何ですか?あなたはC#でCLRインターフェイスを定義しました。 –

答えて

3

私はコメントの@マークの答えを確認しました。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace org.openrdf.repository { 
    public class Repository { 
    } 
} 

namespace CSLib 
{ 

    [System.AttributeUsage(System.AttributeTargets.Interface)] 
    public class TypeExtensionPoint : System.Attribute 
    { 
     public TypeExtensionPoint() 
     { 
     } 
    } 


    [TypeExtensionPoint] 
    public interface ISparqlCommand 
    { 
     string Name { get; } 
     object Run(Dictionary<string, string> NamespacesDictionary, org.openrdf.repository.Repository repository, params object[] argsRest); 
    } 

} 

次のF#の実装は(唯一の変更は、オブジェクトの構築時に()を追加して)「罰金」作品:

#light 

module Module1 

open System 
open System.Collections.Generic; 
open CSLib 

type MyClass() = 
    interface ISparqlCommand with 
     member this.Name = 
      "Finding the path between two tops in the Graph" 
     member this.Run(NamespacesDictionary, repository, argsRest) = 
      new System.Object() 

あなたはもう#lightを使用する必要はありませんが、次のC#コードを考えます(これはデフォルトです)、 "大文字の変数識別子は一般的にはパターンで使用されるべきではなく、誤ったパターン名を示すかもしれない"という警戒名をNamespaceDictionaryというように頭に書いておきたいかもしれません。また、実装されたメンバーにアクセスするには、MyClassISparqlCommandにキャストする必要があります(ご質問はありませんが、C#から混乱を招きやすくなります)。例:(MyClass() :> ISparqlCommand).Name

1

ありがとうございます!次のコードは、実際に動作します:

namespace MyNamespace 

open System 
open System.Collections.Generic; 
open Mono.Addins 

[<assembly:Addin>] 
    do() 
[<assembly:AddinDependency("TextEditor", "1.0")>] 
    do() 

[<Extension>] 
type MyClass() = 
    interface ISparqlCommand with 
     member this.Name 
      with get() = 
       "Finding the path between two tops in a Graph" 
     member this.Run(NamespacesDictionary, repository, argsRest) = 
      new System.Object() 

それはおそらく、ちょうど `新しいSystem.Objectの()`に括弧が欠けても、F#の

関連する問題