در این مقاله از سری مقالات آموزشی پی استور، مفهوم متد و کلاس Sealed در C# را بررسی میکنیم، نحوه پیادهسازی آنها را با مثالهای عملی نشان میدهیم و به کاربردهای مهم آنها در دنیای برنامهنویسی میپردازیم.
مقدمه
در زبان برنامهنویسی C#، مفهوم کلاس Sealed بهعنوان یک ویژگی کلیدی برای محدود کردن ارثبری از کلاسها استفاده میشود. این ویژگی به برنامهنویسان اجازه میدهد تا از تغییرات ناخواسته در سلسلهمراتب کلاسها جلوگیری کنند و امنیت و یکپارچگی کد خود را افزایش دهند. زمانی که یک کلاس با کلیدواژه sealed تعریف میشود، دیگر امکان ایجاد کلاسهای مشتقشده از آن وجود ندارد.
علاوه بر کلاسها، متدها نیز میتوانند سیل شوند تا از بازنویسی «Override» در کلاسهای فرزند جلوگیری شود. این قابلیت در مواقعی که نیاز به حفظ عملکرد اصلی متد بدون تغییر داریم، بسیار مفید خواهد بود.
مفهوم کلاس Sealed در C#
کلاس Sealed در C# برای محدود کردن کاربران از ارثبری از کلاس استفاده میشوند. یک کلاس میتواند با استفاده از کلیدواژه sealed مهر و موم شود. این کلیدواژه به کامپایلر میگوید که کلاس سیلشده است و بنابراین نمیتوان آن را گسترش داد. هیچ کلاسی نمیتواند از یک کلاس سیلشده ارث ببرد. نحو استفاده از کلاس سیلشده در زیر آورده شده است:
sealed class class_name { // data members // methods . . . }
یک متد نیز میتواند سیل شود، و در این صورت، متد نمیتواند بازنویسی (override) شود. با این حال، یک متد میتواند در کلاسی که از آن به ارث برده شده است، سیل شود. اگر بخواهید یک متد را بهعنوان Sealed اعلام کنید، باید آن متد در کلاس پایه بهصورت مجازی (virtual) اعلام شده باشد.
ایجاد کلاس Sealed در C#
برای ایجاد یک کلاس sealed، کافی است از کلمهی کلیدی sealed قبل از class استفاده کنید. در ادامه چند مثال برای استفاده کلاس Sealed در C# آوردیم و هر کدام از مثالها را توضیح دادیم.
مثال ۱: قطعه کد زیر مفهوم کلاس Sealed در C# را نشان میدهد. sealed یک کلمه کلیدی (keyword) در C# است که هنگام تعریف یک کلاس، از به ارث بردن آن توسط کلاسهای دیگر جلوگیری میکند.
// Using Sealed Class using System; // Sealed class sealed class SealedClass { // Calling Function public int Add(int a, int b) { return a + b; } } class PStore { // Main Method static void Main(string[] args) { // Creating an object of Sealed Class SealedClass slc = new SealedClass(); // Performing Addition operation int total = slc.Add(6, 4); Console.WriteLine("Total = " + total.ToString()); } }
خروجی: پس از اجرای برنامه خروجی به شکل زیر خواهد بود.
Total = 10
مثال ۲: قطعه کد زیر به ما نشان میدهد که وقتی یک یک کلاس Sealed در C# تعریف میکنیم، امکان ارثبری از آن وجود ندارد. اگر تلاش کنیم این کار را انجام دهیم، خطای کامپایل دریافت خواهیم کرد.
// Demonstration of restrictions of Sealed Class using System; class Bird { } // Creating a sealed class sealed class Test : Bird { } // Inheriting the Sealed Class class Example : Test { } class PStore { // Main Method static void Main() { } }
خروجی: هنگام اجرای کد، خطای زیر دریافت میشود.
prog.cs(14,7): error CS0509: `Example': cannot derive from sealed type `Test' prog.cs(9,14): (Location of the symbol related to previous error) Compilation failed: 1 error(s), 0 warnings
مثال ۳: مثال زیر را در نظر بگیرید که یک متد Sealed در یک کلاس ارثبری شده است.
تکه کد زیر نشان میدهد که چگونه میتوان یک متد را در یک کلاس مهروموم (Sealed) کرد تا دیگر کلاسهای مشتقشده نتوانند آن را بازنویسی (override) کنند. برخلاف sealed class که کل کلاس را مهروموم میکند، sealed method فقط از بازنویسی مجدد یک متد خاص جلوگیری میکند.
// C# program to define Sealed Class Method using System; class Printer { // Displaying dimension printing public virtual void show() { Console.WriteLine("Display dimension : 6*6"); } public virtual void print() { Console.WriteLine("Printer printing....\n"); } } // Inheriting class class LaserJet : Printer { // Sealed Display Function // for Dimension printing sealed override public void show() { Console.WriteLine("Display dimension : 12*12"); } // Function to override // Print() function override public void print() { Console.WriteLine("Laserjet printer printing....\n"); } } // Officejet class cannot override show // function as it is sealed in LaserJet class. class Officejet : LaserJet { // can not override show function or else // compiler error : 'Officejet.show()' : // cannot override inherited member // 'LaserJet.show()' because it is sealed. override public void print() { Console.WriteLine("Officejet printer printing...."); } } class PStore { // Main Method static void Main(string[] args) { Printer p = new Printer(); p.show(); p.print(); Printer ls = new LaserJet(); ls.show(); ls.print(); Printer of = new Officejet(); of.show(); of.print(); } }
خروجی
Display dimension : 6*6 Printer printing.... Display dimension : 12*12 Laserjet printer printing.... Display dimension : 12*12 Officejet printer printing....
- sealed روی متدها باعث میشود که کلاسهای فرزند دیگر نتوانند آن متد را بازنویسی (override) کنند.
- درمثال بالا، LaserJet متد ()showرا بازنویسی کرده و سپس آن را sealed کرده، بنابراین Officejet دیگر نمیتواند آن را تغییر دهد.
- اما Officejet همچنان میتواند متد ()print را بازنویسی کند، زیرا sealed نشده است.
این ویژگی زمانی کاربرد دارد که بخواهیم متد خاصی در زنجیره ارثبری ثابت بماند و تغییر نکند.
نکات مهم:
- یک کلاس Sealed برای جلوگیری از ارثبری از یک کلاس استفاده میشود. نمیتوان هیچ کلاسی را از آن ارث برد یا گسترش داد.
- متد Sealed بهگونهای پیادهسازی میشود که هیچ کلاس دیگری نتواند آن را بازنویسی کرده و متد خود را پیادهسازی کند.
- هدف اصلی کلاس سیلشده این است که ویژگی ارثبری را از کاربر بردارد تا نتواند کلاسی را از یک کلاس سیلشده به ارث ببرد.
- کلاس Sealed بهترین استفاده را زمانی دارند که یک کلاس با اعضای استاتیک داریم.
برای مثال: کلاسهای “Pens” و “Brushes” از فضای نام System.Drawing. کلاس Pens نمایانگر قلمها برای رنگهای استاندارد است. این کلاس فقط اعضای استاتیک دارد. بهعنوان مثال، “Pens.Red” نمایانگر یک قلم با رنگ قرمز است. به همین ترتیب، کلاس “Brushes” نمایانگر قلمموهای استاندارد است. “Brushes.Red” نمایانگر یک قلممو با رنگ قرمز است.
نتیجه گیری
کلاس Sealed در C# ابزاری قدرتمند برای کنترل ارثبری و افزایش امنیت کد هستند. با استفاده از کلیدواژه sealed، میتوان از گسترش ناخواسته کلاسها جلوگیری کرد و یکپارچگی ساختار برنامه را حفظ نمود. این ویژگی بهویژه در مواردی که کلاسهایی با اعضای استاتیک داریم یا نمیخواهیم رفتار یک کلاس توسط کلاسهای دیگر تغییر کند، بسیار مفید است.
علاوه بر کلاسها، متدهای سیلشده نیز امکان جلوگیری از بازنویسی را فراهم میکنند و در مواقعی که نیاز به حفظ عملکرد اصلی یک متد داریم، کارایی بالایی دارند. در مجموع، استفاده صحیح از کلاسها و متدهای سیلشده میتواند به بهبود طراحی نرمافزار، افزایش خوانایی کد و کاهش خطاهای احتمالی کمک کند.