2008-11-22 97 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