کلاس Sealed در C# — به زبان ساده

تصویر شاخص کلاس Sealed در C#

در این مقاله از سری مقالات آموزشی پی استور، مفهوم متد و کلاس 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، می‌توان از گسترش ناخواسته کلاس‌ها جلوگیری کرد و یکپارچگی ساختار برنامه را حفظ نمود. این ویژگی به‌ویژه در مواردی که کلاس‌هایی با اعضای استاتیک داریم یا نمی‌خواهیم رفتار یک کلاس توسط کلاس‌های دیگر تغییر کند، بسیار مفید است.

علاوه بر کلاس‌ها، متدهای سیل‌شده نیز امکان جلوگیری از بازنویسی را فراهم می‌کنند و در مواقعی که نیاز به حفظ عملکرد اصلی یک متد داریم، کارایی بالایی دارند. در مجموع، استفاده صحیح از کلاس‌ها و متدهای سیل‌شده می‌تواند به بهبود طراحی نرم‌افزار، افزایش خوانایی کد و کاهش خطاهای احتمالی کمک کند.


سوالات متداول


کلاس Sealed در C# چه کاربردی دارد؟

کلاس Sealed در C# برای جلوگیری از ارث‌بری و تغییر رفتار کلاس استفاده می‌شود. این ویژگی به افزایش امنیت و پایداری کد کمک می‌کند.

آیا می‌توان یک کلاس Sealed در C# را گسترش داد؟

خیر، هیچ کلاسی نمی‌تواند از یک کلاس Sealed ارث ببرد، زیرا این نوع کلاس‌ها برای جلوگیری از گسترش طراحی شده‌اند.

آیا می‌توان متدهای یک کلاس Sealed در C# کرد؟

بله، در صورتی که یک متد در کلاس پایه به‌صورت virtual تعریف شده باشد، می‌توان آن را در کلاس فرزند sealed کرد تا از بازنویسی (Override) در کلاس‌های دیگر جلوگیری شود.

چه تفاوتی بینکلاس Sealed در C# و کلاس استاتیک وجود دارد؟

کلاس Sealed در C# از ارث‌بری جلوگیری می‌کند، اما می‌تواند شامل سازنده و نمونه‌سازی شود. در مقابل، کلاس استاتیک قابل نمونه‌سازی نیست و تمام اعضای آن باید استاتیک باشند.

چه زمانی استفاده از کلاس Sealed توصیه می‌شود؟

زمانی که بخواهید از تغییر یا گسترش یک کلاس جلوگیری کنید، مانند کلاس‌هایی که دارای اعضای استاتیک هستند یا کلاس‌هایی که نباید تغییر داده شوند، مانند برخی از کلاس‌های کتابخانه‌های داخلی سی‌شارپ.

آیا کلاس‌های استاندارد سی‌شارپ از این ویژگی استفاده می‌کنند؟

بله، برخی از کلاس‌های موجود در دات‌نت مانند System.String و System.Math به‌صورت سیل‌شده تعریف شده‌اند تا از ارث‌بری و تغییرات ناخواسته جلوگیری شود.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 5 از 4 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
سی شارپ


پیمایش به بالا