2008-11-22 11 views
10

Nachdem ich this PDC Sitzung gesehen habe, wollte ich versuchen, ein bisschen F # zu lernen. Also dachte ich, der beste Weg wäre, etwas in F # umzuschreiben, etwas, das ich schon in C# gemacht habe, aber mein Gehirn weigert sich einfach, im funktionalen Modus zu denken. Ich habe diese abstrakte Klasse, die einige abstrakte Methoden und einige virtuelle Methoden hat. Ich möchte auch einige der virtuellen Methoden außer Kraft setzen. Diese Klasse ist in C# geschrieben und kompiliert, und ich beabsichtige nicht, sie in F # neu zu schreiben. Also meine Frage ist:Wie implementiert man eine abstrakte Klasse in F #?

  1. jemand eine kurze Probe hat, wie eine abstrakte Klasse, abstrakte Methode und virtuelle Methode
  2. kann ich Konstrukteurs überlastet zu implementieren?
  3. gibt es irgendwelche Einschränkungen, wenn ich es in einer DLL kompilieren und es meinen C# -basierten Programmen zur Verfügung stellen möchte.

Jede Hilfe wäre willkommen.


Update: ich wirklich zu schätzen wirklich Brians Antwort, aber es ist immer noch nicht klar für mich, so will ich klarstellen. Nehmen wir an, das ist meine abstrakte Klasse, die in C# geschrieben und in DLL kompiliert wird. Wie implementiere ich es in 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; } 
} 

Ein Teil der Dokumentation für wen auch immer für einige F # Ressourcen sucht: - wenn andere F # eine Dokumentation bekommen ich auf Don Syme (Konzept von F #) Blog free chapters of his book F# Expert gefunden interessiert ist. Sie können diese im Doc-Format herunterladen.

Einige andere Ressourcen, die von Interesse sein könnten:

Antwort

14

Hier ist ein Beispielcode

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

Ist es möglich, dass eine F # abstrakte Klasse zu einer Schnittstelle zu implementieren? – Stringer

+0

Ich habe editiert, um einen Weg zu zeigen, es zu tun. – Brian

+0

Aktual ich gemanagt ist es möglich, abstrakte Mitglieder, die Schnittstelle eine Schnittstelle haben. Z.B. Schnittstelle IBaz mit abstract member Baz: int -> int – Stringer

Verwandte Themen