کلاس و متد Sealed در #C
شنبه 21 فروردین 1395شما از کلاس sealed نمیتوانید ارث بری کنید. کلمه ی کلیدی sealed کلاس مورد نظر شما را مهر و موم میکند تا نتوان از آن ارث بری کرد. در این مقاله میخواهیم در مورد کلاس sealed و متدهای آن در #C صحبت کنیم.
چرا شما به کلاس sealed نیاز دارید؟
کلاسها میتوانند به گونه ای نوشته شوند که قابلیت ارث بری داشته باشند و یا اینکه قادر به ارث بری از هیچ کلاس دیگری نباشند. اگر کلاسی قابلیت ارث بری کردن را داشته باشد شما باید قابلیت ها و متدهای بیشتری را برای این کلاس در نظر بگیرید و این امر باعث پیچیده شدن متدها ودر نتیجه پیچیده شدن پروژه شما خواهد شد.
اگر شما کلاسی دارید که که مطمئن هستید که این کلاس هرگز به عنوان کلاس پایه مورد استفاده قرار نخواهد گرفت ، باید این کلاس را sealed تعریف کنید. این امر نه تنها باعث میشود که برنامه ی شما ساده تر شود بلکه باعث میشود برنامه ی شما هیچ باگی که ناشی از ناهمخوانی و ابهام باشد، نداشته باشد.
ثانیا، این امر باعث میشود که برنامه شما بهتر اجرا شود و چون کلاس sealed هیچگاه کلاس پایه نخواهد بود زمان اجرا ، فراخوانی آن بسیار سریعتر از سایر کلاسها انجام خواهد شد.
نکته: از یک کلاس static نه میتوان ارث بری کرد و نه میتوان از آن نمونه (instance) ساخت ولی در مورد کلاس sealed ، شما میتوانید از آن به تعدادی که میخواهید نمونه بسازید و فقط نمیتوانید از آن ارث بری کنید.
به کد زیر توجه کنید:
کلاس A یک کلاس sealed است که از آن دو نمونه ساخته شده است که اولی در کلاس B و دومی در تابع اصلی قرار دارد.
1. class Program 2. { 3. static void Main(string[] args) 4. { 5. B b = new B(); 6. b.print_B(); 7. 8. A a = new A(); 9. a.printA(); 10. 11. Console.ReadLine(); 12. } 13. } 14. 15. sealed class A 16. { 17. private int x = 1; 18. public void printA() 19. { 20. Console.WriteLine(x); 21. } 22. } 23. 24. class B 25. { 26. public void print_B() 27. { 28. A a = new A(); 29. a.printA(); 30. } 31. }
اکنون بیایید ببینیم چه اتفاقی می افتد اگر که کلاس B از کلاس A ارث بری کند.
همانطور که مشاهده میکنید در کادر مربوط به compilation error پیام بالا نمایش داده میشود که بیان میکند که کلاس B نمیتواند از یک کلاس از نوع sealed با نام A ارث بری کند.
یادآوری : سایر کلاسها نمیتوانند از کلاس sealed ارث بری کنند ولی کلاس sealed میتواند از کلاس های دیگر ارث بری کند.
آیا میتوان متدها را از نوع sealed تعریف کرد؟
پاسخ مثبت است، شما میتوانید مانند کلاسها، متدها را نیز با استفاده از کلمه ی کلیدیsealed مهر و موم کنید با این تفاوت که شما باید از کلمه ی کلیدی "override " نیز استفاده کنید.
به عبارت دیگر ، در هر سطحی از ارث بری ، اگر میخواهید که کلاس مشتق شده ی بعدی از کلاس دیگری ارث بری نکند از کلمه ی کلید ی sealed به همراه کلمه ی کلیدی override استفاده میکنیم.
به کد زیر دقت کنید.
1. namespace ConsoleApplication2 2. { 3. class A 4. { 5. virtual public void printA() 6. { 7. Console.WriteLine("In class A"); 8. } 9. } 10. 11. class B : A 12. { 13. sealed override public void printA() 14. { 15. Console.WriteLine("In class B"); 16. } 17. } 18. 19. class C : B 20. { 21. override public void printA() //Error: cannot override inherited member 22. { //B.printA() because it is sealed. 23. 24. } 25. } 26. }
در خط 21 کد بالا ما با یک error مواجه میشویم که علت آن override کردن یک sealed virtual method میباشد.
امیدواریم که مطالب این مقاله برای شما مفید بوده باشد و نحوه ی ایجاد و استفاده از کلاس و متد sealed را آموخته باشید.
- C#.net
- 3k بازدید
- 3 تشکر