کلاس Sealed و Static در #C

جمعه 21 اسفند 1394

در این مقاله قصد داریم شما را با کلاس sealed و static آشنا کنیم و تفاوت آنها را با سایر کلاسها بیان میکنیم. همچنین توضیح خواهیم داد که چگونه میتوان یک کلاس ازآنها ساخت و در برنامه از ان استفاده کرد.

 کلاس Sealed و Static در #C

کلاس static  چیست؟

یک کلاس static  در یک مورد با کلاس غیر static تفاوت دارد و آن هم این است که از یک کلاس static  نمیتوان نمونه ساخت. به عبارتی دیگر ، شما نمیتوانید از کلمه ی کلیدی new برای ساختن یک متغیر از این کلاس استفاده کنید. شما میتوانید با استفاده از نام کلاس ،  از اعضاء و متدهای کلاس static  استفاده کنید .

برای مثال ، به کلاس static زیر توجه کنید که در آن یک متد static وجود دارد که دو عدد را با هم جمع میکند. این یک مثال برای در ک بهتر کلاس static است و  در سایر موارد، ما برای عمل جمع  از کلاس Math  که در فضای نام System  استفاده میکنیم. 

1.	public static class MathUtility  
2.	{  
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
-4
3

اطلاعات مربوط به کلاس 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.	classBaseClass  
2.	{  
3.	  
4.	}   
5.	sealed class SealedClass : BaseClass  
6.	{  
7.	  
8.	}  

همچنین ما میتوانیم متدها و property ها را نیز sealed تعریف کنیم. همچنین میتواینم  propertyها و متدهای override شده ی یک کلاس پایه (کلاسی که از آن ارث بری میشود) را در کلاس فرزندش از نوع sealed تعریف کنیم که با این کار sub-class های دیگر نمیتوانند از این sub-class ارث بری کنند.

1.	class A  
2.	{  
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: A  
13.	{  
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: B  
2.	{  
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.این کلاسها توسط کلاسهای دیگر نمیتواند ارث بری شود.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 10k بازدید
  • 8 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید