10

このPDC セッションを見た後、F# について少し学びたいと思いました。したがって、C# で既に行ったことを F# で書き直すのが最善の方法だと思いましたが、私の脳は機能モードで考えるのを拒否しています。いくつかの抽象メソッドといくつかの仮想メソッドを持つこの抽象クラスがあります。一部の仮想メソッドもオーバーライドしたいと思います。このクラスは C# で記述され、コンパイルされています。F# で書き直すつもりはありません。だから私の質問は:

  1. 抽象クラス、抽象メソッド、および仮想メソッドを実装する方法の短いサンプルを持っている人はいますか
  2. コンストラクターをオーバーロードできますか?
  3. dll でコンパイルして C# ベースのプログラムで使用できるようにする場合、制約はありますか。

どんな助けでも大歓迎です。


更新:ブライアンの答えには本当に感謝していますが、まだはっきりしていないので、明確にしたいと思います。これが、C# で記述され、dll でコンパイルされた抽象クラスであるとしましょう。F# で実装するにはどうすればよいですか?

public abstract class MyAbstractClass
{
    public abstract Person GetFullName(string firstName, string lastName);

    public abstract bool TryParse(string fullName, out Person person);

    public virtual IEnumerable<Person> GetChildren(Person parent)
    {
        List<Person> kids = new List<Person>();
        foreach(Child person in GroupOfPeople)
        {
            if(person.Parent == parent)
               kids.Add(child as Person);
        }
        return kids;
    }

    public virtual IEnumerable<Child> GroupOfPeople { get; set; }
}

F# リソースを探している人のためのドキュメント: - Don Syme (F# の作成者) のブログで見つけたドキュメントを入手したい他の F# がいる場合は、彼の本 F# Expert の無料の章を参照してください。それらは doc 形式でダウンロードできます。

興味のあるその他のリソース:

4

1 に答える 1

14

ここにいくつかのサンプルコードがあります

type IBaz =
    abstract member Baz : int -> int

[<AbstractClass>]
type MyAbsClass() =
    // abstract
    abstract member Foo : int -> int
    // virtual (abstract with default value)
    abstract member Bar : string -> int
    default this.Bar s = s.Length 
    // concrete
    member this.Qux x = x + 1

    // a way to implement an interface
    abstract member Baz: int -> int
    interface IBaz with
        member this.Baz x = this.Baz x

type MySubClass(z : int) =
    inherit MyAbsClass()
    override this.Foo x = x + 2
    override this.Bar s = (base.Bar s) - 1
    override this.Baz x = x + 100
    member this.Z = z
    new () = MySubClass(0)

let c = new MySubClass(42)    
printfn "%d %d %d %d %d" c.Z (c.Foo 40) (c.Bar "two") (c.Qux 41) (c.Baz 42000)
于 2008-11-22T00:57:21.297 に答える