سلام درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. generics به شما اجازه می دهد یک کلاس یا متد را که بتواند با هر نوع داده کار کند، بنویسید. بنابراین در این قسمت Generics در #F و سینتکس ساختار Generics در #F و کلاس Generics رو مورد بررسی قرار می دهیم.
Generics به شما اجازه می دهد مشخصات خاصی از نوع داده های برنامه نویسی را در یک کلاس یا یک روش به تاخیر بیندازید تا وقتی که در واقع در برنامه استفاده شود.
به عبارت دیگر، generics به شما اجازه می دهد یک کلاس یا متد را بنویسید که بتواند با هر نوع داده کار کند.
مشخصات کلاس یا روش را با پارامترهای substitute برای انواع داده بنویسید.
هنگامی که کامپایلر با یک constructor برای کلاس یا یک تابع فراخوان ،برای متد مواجه می شود، کد را برای handle نوع خاصی داده تولید می کند.
در اف شارپ، function values, methods, properties و aggregate types مانند classes, records و discriminated unions مي توانند عام یا Generics باشند.
ساختارهای عمومی یا Generics شامل حداقل یک پارامتر type است.
Generic functions و types شما را قادر می سازند تا کد هایی بنویسید که با انواع مختلف کار می کنند بدون تکرار کد برای هر type از آن ها .
سینتکس نوشتن یک ساختار Generics به شرح زیر است:
1 2 3 4 5 6 7 8 9 10 11 | // Explicitly generic function. let function-name<type-parameters> parameter-list = function-body // Explicitly generic method. [ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] = method-body // Explicitly generic class, record, interface, structure, // or discriminated union. type type-name<type-parameters> type-definition |
1 2 3 4 5 | (* Generic Function *) let printFunc<'T> x y = printfn "%A, %A" x y printFunc<float> 10.0 20.0 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 10.0, 20.0 |
شما همچنین می توانید یک تابع عمومی را با استفاده از سینتکس تک کوتیشن مارک انجام دهید.
1 2 3 4 5 | (* Generic Function *) let printFunction (x: 'a) (y: 'a) = printfn "%A %A" x y printFunction 10.0 20.0 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | 10.0, 20.0 |
لطفا توجه داشته باشید که وقتی از توابع یا روش Generics استفاده می کنید، ممکن است لازم نباشد نوع آرگومان را مشخص کنید.
با این حال، در صورت ابهام، شما می توانید آرگومان type را در براکت های ارائه شده همانطور که در مثال اول انجام دادیم تولید کنید.
اگر شما بیش از یک type دارید، باید چندین آرگومان نوع را با کاما جدا کنید.
همچون توابع Generics ، شما می توانید کلاس های Generics را بنویسید. مثال زیر این را نشان می دهد.
1 2 3 4 5 | type genericClass<'a> (x: 'a) = do printfn "%A" x let gr = new genericClass<string>("zara") let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } ) |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 | "zara" seq [(1, 1); (2, 4); (3, 9); (4, 16); ...] |
در سینتکس ساختار Generics در #F دیدیم که ما می توانیم یک تابع عمومی یا generics را با استفاده از سینتکس تک کوتیشن مارک یا براکت ها تعریف نماییم.