2008-11-22 38 views
10

Sau khi tôi đã xem this phiên PDC tôi muốn cố gắng tìm hiểu một chút về F #. Vì vậy, tôi nghĩ cách tốt nhất sẽ là viết lại trong F # một cái gì đó tôi đã làm trong C# nhưng bộ não của tôi chỉ từ chối suy nghĩ trong chế độ chức năng. Tôi có lớp trừu tượng này có một số phương thức trừu tượng và một số phương thức ảo. Tôi cũng muốn ghi đè lên một số phương thức ảo. Lớp này được viết bằng C# và được biên dịch và tôi không có ý định viết lại nó i F #. Vì vậy, câu hỏi của tôi là:Làm thế nào để thực hiện một lớp trừu tượng trong F #?

  1. không ai có một mẫu ngắn làm thế nào để thực hiện một lớp trừu tượng, phương pháp trừu tượng và phương pháp ảo
  2. tôi có thể đã bị quá tải nhà xây dựng?
  3. có bất kỳ ràng buộc nào không nếu tôi muốn biên dịch nó thành một dll và cung cấp cho các chương trình dựa trên C# của tôi.

Mọi trợ giúp sẽ được đánh giá cao.


Cập nhật: Tôi thực sự đánh giá cao câu trả lời của Brian nhưng vẫn chưa rõ với tôi vì vậy tôi muốn làm rõ. Hãy giả vờ đây là lớp trừu tượng của tôi được viết bằng C# và được biên dịch trong dll. Làm thế nào để thực hiện nó trong 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; } 
} 

Một số tài liệu cho bất cứ ai đang tìm kiếm một số F # nguồn: - nếu có khác F # là quan tâm để có được một số tài liệu tôi tìm thấy trên Don Syme của (tác giả của F #) trên blog free chapters of his book F# Expert. Bạn có thể tải xuống chúng ở định dạng doc.

Một số các nguồn lực khác mà có thể quan tâm:

Trả lời

14

Dưới đây là một số mẫu mã

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

Có thể cho một lớp trừu tượng F # để thực hiện một giao diện quá? – Stringer

+0

Tôi đã chỉnh sửa để hiển thị một cách để thực hiện điều đó. – Brian

+0

Thực tế ý tôi là có thể có thành viên trừu tượng giao diện một giao diện. Ví dụ. giao diện IBaz với thành viên trừu tượng Baz: int -> int – Stringer

Các vấn đề liên quan