سؤال

بعد أن رأيت هذا جلسة PDC أردت أن أحاول تعلم القليل من F#.لذلك اعتقدت أن أفضل طريقة هي إعادة كتابة شيء ما قمت به بالفعل في C# في F# لكن عقلي يرفض التفكير في الوضع الوظيفي.لدي هذه الفئة المجردة التي تحتوي على بعض الأساليب المجردة وبعض الأساليب الافتراضية.أرغب في تجاوز بعض الأساليب الافتراضية أيضًا.هذا الفصل مكتوب بلغة C# وتم تجميعه ولا أنوي إعادة كتابته في 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# مهتمًا بالحصول على بعض الوثائق التي وجدتها في مدونة Don Syme (منشئ F#) فصول مجانية من كتابه F# Expert.يمكنك تنزيل تلك بتنسيق doc.

بعض الموارد الأخرى التي قد تهمك:

هل كانت مفيدة؟

المحلول

إليك بعض نماذج التعليمات البرمجية

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top