0 امتیاز
قبل در برنامه نویسی توسط (111 امتیاز)
ویرایش شده قبل توسط
درست است که در #F امکان تعریف اینترفیس وجود دارد و یک کلاس می‌تواند اینترفیس مورد نظر را پیاده سازی کند ولی هنگام فراخوانی متد‌های کلاس (اون هایی که مربوط به اینترفیس است) حتما باید instance کلاس مربوطه به اینترفیس cast شود و این کمی آزار دهنده است.(در فصل شی گرایی در این مورد شرح داده شده است).

1 پاسخ

+1 امتیاز
قبل توسط (1.4هزار امتیاز)
ویرایش شده قبل توسط

فرض کنید که یک interface (با نام IPrintable) و یک class (با نام CanonPrinter) که آن را implements کرده به صورت زیر تعریف شده است:

type IPrintable =
   abstract member Print : unit -> unit

type CanonPrinter(x: int, y: float) =
   interface IPrintable with 
      member this.Print() = printfn "%d %f" x y

اگر بخواهیم یک شی از کلاس CanonPrinter ساخته و متدی را call کنیم که در IPrinter تعریف شده است (در اینجا متد Print)، باید در موقع فراخوانی، آن شی را به IPrinter به اصطلاح UpCast کنیم: 

let printer= new CanonPrinter(1, 2.0)
(printer:> IPrintable).Print()

یه راه دیگه هست که باعث میشه موقع هر فراخوانی لازم نباشه که cast کنیم:

type CanonPrinter(x: int, y: float) =
   member this.Print() = (this :> IPrintable).Print()
   interface IPrintable with 
      member this.Print() = printfn "%d %f" x y

let printer = new CanonPrinter(1, 2.0)
printer.Print()
قبل توسط (111 امتیاز)
مرسي از جوابتون يك سايتي نوشته بود كه اين ضعف اف شارپه حالا بنظرتون اين ضعف را ميتوان از بين برد مثلا با تركيب اف شارپ و با يك زبان ديگه
قبل توسط (1.4هزار امتیاز)
بالا راهشو توضیح دادم

سوالات مشابه

0 امتیاز
0 پاسخ 782 بازدید
0 امتیاز
0 پاسخ 510 بازدید
+3 امتیاز
1 پاسخ 958 بازدید
+1 امتیاز
5 پاسخ 7.8هزار بازدید
0 امتیاز
1 پاسخ 330 بازدید
+1 امتیاز
1 پاسخ 1.2هزار بازدید
0 امتیاز
2 پاسخ 577 بازدید
...