كيفية تنفيذ فئة مجردة في F#؟
-
10-07-2019 - |
سؤال
بعد أن رأيت هذا جلسة PDC أردت أن أحاول تعلم القليل من F#.لذلك اعتقدت أن أفضل طريقة هي إعادة كتابة شيء ما قمت به بالفعل في C# في F# لكن عقلي يرفض التفكير في الوضع الوظيفي.لدي هذه الفئة المجردة التي تحتوي على بعض الأساليب المجردة وبعض الأساليب الافتراضية.أرغب في تجاوز بعض الأساليب الافتراضية أيضًا.هذا الفصل مكتوب بلغة C# وتم تجميعه ولا أنوي إعادة كتابته في F#.لذلك سؤالي هو:
- هل لدى أي شخص عينة قصيرة عن كيفية تنفيذ فئة مجردة وطريقة مجردة وطريقة افتراضية
- يمكن أن يكون لدي منشئين مثقلة؟
- هل هناك أي قيود إذا كنت أرغب في تجميعها في ملف 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.
- البرمجة الوظيفية في العالم الحقيقي بقلم توماس بيتريسك الفصل المجاني هنا
بعض الموارد الأخرى التي قد تهمك:
- مدونة سكوت هانسيلمان بريد
- مدونة داستن كامبل
- مدونة توماس بيتريسيك
- المكان لـ F# - hubFS
- ف# ويكي
- أبحاث مايكروسوفت
المحلول
إليك بعض نماذج التعليمات البرمجية
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)