کلاس Sealed و Static در #C

کلاس static چیست؟ برای مثال ، به کلاس static زیر توجه کنید که در آن یک متد static وجود دارد که دو عدد را با هم جمع میکند. این یک مثال برای در ک بهتر کلاس static است و در سایر موارد، ما برای عمل جمع از کلاس Math که در فضای نام System استفاده میکنیم.1. public static class MathUtility2. {3. public static int Add(int a, int b)4. {5. returna + b;6. }7. }اکنون ما میتوانیم متد Add را به روش زیر فراخوانی کنیم :1. int result = MathUtility.Add(2,5);یک کلاس static یک ابزار آسان برای تنظیم پارامترهای ورودی است که عملیات get و set را در هیچ یک از فیلدهای internal instance انجام نمیدهد. برای مثال ، در کتابخانه کلاس .NET Framework ، کلاس System.Math یک کلاس static است که شامل تابع ها / متدهایی است که عملیات ریاضی را انجام میدهد بدون اینکه هیچ کدام از آنها نیاز داشته باشند نمونه ای از کلاس Math وجود داشته باشد. به این ترتیب شما میتوانید اعضا کلاس Math را تنها با نوشتن نام شان فراخوانی و استفاده کنید . به مثال زیر توجه کنید :1. double dub = -3.14;2. Console.WriteLine(Math.Abs(dub));3. Console.WriteLine(Math.Floor(dub));4. Console.WriteLine(Math.Round(Math.Abs(dub)));خروجی :3.14-43اطلاعات مربوط به کلاس static ، برای اولین بار که برنامه به آن ارجاع داده میشود توسط .NET Framework common language runtime (CLR)بارگذاری میشود. برنامه هیچ اطلاعی در مورد بارگذاری این کلاس نمیدهد اما کلاسهای static بارگذاری میشوند و فیلدهای خود را مقدار دهی اولیه میکنند و سازنده (constructor) کلاس static قبل از این کلاس برای اولین بار در برنامه بارگذاری شود ارجاع داده خواهد شد. Constructorمربوط به کلاس static فقط یکبار صدا زده میشود و تا زمانیکه برنامه در حال اجرا است در حافظه باقی میماند.ویژگی های کلاس static :1.اعضای آن static هستند.2.نمیتوان از آن نمونه ساخت.3.این کلاس یک کلاس از نوع sealedنیز میباشد.4.چون کلاس static یک نوع کلاسsealed نیز میباشد نمیتوان از آن ارث بری کرد.5.ما نمیتوانیم از یک کلاس static نمونه بسازیم در نتیجه از اعضای داخلی آن نیز نمیتوانیم نمونه داشته باشیم و بنابراین کلاس static به این معنی است که تنها یک کپی از کلاس در سراسر برنامه استفاده میشود و دسترس همه قرار میگیرد.6. کلاس static از کلاسهاس دیگر نمیتواند ارث بری کند.کلاس sealed چیست؟یک کلاس sealed نمیتواند ارث بری شود (این بدان معنی است که این نوع از کلاسها به عنوان کلاس پایه مورد استفاده قرار نمیگیرند). این کلاس مانع ارث بری سایر کلاسها از خودش میشود. بنابراین کلاسهای دیگر نمیتوانند از کلاسی که saeled تعریف شده است ، ارث بری کنند.به مثال زیر توجه کنید :1. classBaseClass2. {3.4. }5. sealed class SealedClass : BaseClass6. {7.8. }همچنین ما میتوانیم متدها و property ها را نیز sealed تعریف کنیم. همچنین میتواینم propertyها و متدهای override شده ی یک کلاس پایه (کلاسی که از آن ارث بری میشود) را در کلاس فرزندش از نوع sealed تعریف کنیم که با این کار sub-class های دیگر نمیتوانند از این sub-class ارث بری کنند.1. class A2. {3. protected virtual void Foo()4. {5. Console.WriteLine("A.Foo");6. }7. protected virtual void Bar()8. {9. Console.WriteLine("A.Bar");10. }11. }12. class B: A13. {14. sealed protected override void Foo()15. {16. Console.WriteLine("B.Foo");17. }18. protected override void Bar()19. {20. Console.WriteLine("B.Bar");21. }22. }حال به این کد زیر نیز دقت کنید :1. class C: B2. {3. // Attempting to override Foo causes compiler error CS0239.4. // protected override void Foo() { Console.WriteLine("C.Foo"); }5. // Overriding F2 is allowed.6. protected override void Bar()7. {8. Console.WriteLine("C.Bar");9. }10. }دقت داشته باشید که شما نمیتوانید یک کلاس را در آن واحد هم abstractو هم sealed تعریف کنید زیرا کلاس از نوع abstract باید توسط sub-class دیگر ارث بری شود که در آن متدها و property های کلاس abstract پیاده سازی میشود.همچنین زمانیکه شما یک متد را sealed تعریف میکنید باید حتما این متد overrideهم شود. Structها در .NET Framework مانند کلاسهای sealed ارث بری نمیشوند.برخی از بهینه سازی های زمان اجرا ، هنگامی انجام میشوند که اعضای کلاس sealed صدا زده میشوند ، بنابراین فراخوانی کلاسهایی از نوع sealed سریعتر از فراخوانی کلاسهای دیگر انجام میشود.نکات زیر را در مورد sealed classها بخاطر بسپارید:1. در sealed classنمیتوانند نمونه بسازند.2.این کلاسها میتوانند از کلاسهای دیگر ارث بری کنند.3.این کلاسها توسط کلاسهای دیگر نمیتواند ارث بری شود.پایان - منبع : برنامه نویسان