2008-11-22 78 views
10

我見過this PDC會話後,我想嘗試學習一點F#。所以我認爲最好的方法是在F#中重寫我已經在C#中完成的東西,但我的大腦拒絕在功能模式下思考。 我有這個抽象類有一些抽象方法和一些虛擬方法。我想重寫一些虛擬方法。這個類是用C#編寫的,並且我不打算用F#來重寫它。 所以我的問題是:如何在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#資源: - 如果任何其他F#有興趣得到一些資料我對唐賽姆的博客free chapters of his book F# Expert(F#的創建者)發現。你可以用doc格式下載這些文件。

的利益,可能一些其它資源:

回答

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) 
+0

是否有可能爲F#抽象類實現一個接口呢? – Stringer 2009-10-26 23:48:08