2008-11-22 23 views
10

Po obejrzeniu sesji PDC this chciałem spróbować nauczyć się trochę F #. Pomyślałem więc, że najlepszym rozwiązaniem byłoby przepisanie w języku F # czegoś, co już zrobiłem w C#, ale mój mózg po prostu odmawia myślenia w trybie funkcjonalnym. Mam tę klasę abstrakcyjną, która ma kilka metod abstrakcyjnych i kilka metod wirtualnych. Chciałbym również zastąpić niektóre metody wirtualne. Ta klasa jest napisana w C# i skompilowana i nie mam zamiaru przepisywać jej w F #. Więc moje pytanie brzmi:Jak zaimplementować klasę abstrakcyjną w języku F #?

  1. czy ktoś ma krótką próbkę jak zaimplementować klasę abstrakcyjną, sposób abstrakcyjny i metody wirtualny
  2. mogę mieć przeciążony konstruktorów?
  3. czy są jakieś ograniczenia, jeśli chcę skompilować je w bibliotekę dll i udostępnić je moim programom opartym na C#.

Każda pomoc zostanie doceniona.


Aktualizacja: ja naprawdę bardzo cenione odpowiedź Briana, ale to nadal nie jest dla mnie jasne, więc chcę wyjaśnić. Udawajmy, że to moja abstrakcyjna klasa napisana w C# i skompilowana w dll. Jak zaimplementować go w 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; } 
} 

Niektóre dokumentacja dla każdego, kto szuka niektórych F # zasobów: - czy jakakolwiek inna F # jest zainteresowany, aby uzyskać pewne dokumentacji znalazłem na Don Syme'S (twórca F #) Blog free chapters of his book F# Expert. Możesz pobrać te w formacie doc.

niektórych innych zasobów, które mogłyby zainteresowania:

Odpowiedz

14

Oto niektóre przykładowy kod

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

Czy jest możliwe dla F # abstrakcyjnej klasy implementują interfejs też? – Stringer

+0

Edytowałem, aby pokazać sposób na zrobienie tego. – Brian

+0

Rzeczywiście miałem na myśli, aby mieć członka abstrakcyjnego, który interfejs interfejs. Na przykład. interfejs IBaz z element abstrakcyjny Baz: int -> int – Stringer

Powiązane problemy