PDA

View Full Version : کلمه sealed



آرام جان گل
پنج شنبه 21 آذر 1387, 10:13 صبح
سلام

کلمه Sealed یعنی چه ؟ چرا نمی تونیم از همچین کلاس هایی وراثت رااعمال کنیم؟ از کجا می فهمیم که مثلا کلاس String از نوع sealed است؟

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

dark-man
پنج شنبه 21 آذر 1387, 11:20 صبح
سلام

کلمه Sealed یعنی چه ؟ چرا نمی تونیم از همچین کلاس هایی وراثت رااعمال کنیم؟ از کجا می فهمیم که مثلا کلاس String از نوع sealed است؟

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


کلاسهای sealedکلاسهایی هستند که اساس کارشون برخلاف کلاسهای abstract هست که نمیشه ازشون ارث بری کرد فقط میشه از یک کلاس sealed نمونه سازی کرد . در واقع میشه گفت کلاسهای sealed نوعی کلاس اختصاصی هست که برنامه نویس نمی خواد از کلاس ارث بری بشه تا مقادیر کلاس ثابت بمونن

علیرضا مداح
پنج شنبه 21 آذر 1387, 12:34 عصر
سلام دوست عزیز،
برای اینکه متوجه شوید کلاسی به صورت sealed تعریف شده است، کافیست بر روی نام آن کلاس راست کلیک کرده و گزینه Go To Definition را انتخاب کنید یا اینکه کلید F12 را بزنید،
مسئله ی دیگر اینکه هم اعضای کلاس - Class Members(اگر و تنها اگر همراه با کلیدواژه override باشند) و هم کلاس ها می توانند به صورت sealed تعریف شوند، هنگامی که یک کلاس با کلیدواژه sealed اعلان می شود،امکان به ارث بری از آن وجود نخواهد داشت، به طور مثال به کد زیر توجه کنید :


public sealed class ParentClass
{
}
public class ChildClass : ParentClass // Error
{
}

اجرای کد فوق خطای زیر را تولید میکند :



'ChildClass': cannot derive from sealed type 'ParentClass'

نکته : کلاسهای sealed در هنگام به ارث بری در اعلان کلاس، توسط Intellisense نمایش داده نمیشوند،


کلیدواژه sealed برای یک عضو کلاس تنها زمانی صحیح است که همراه با کلیدواژه override باشد، هنگامیکه در یک کلاس فرزند، عضوی را به صورت sealed override، تحریف میکنید، دیگر امکان override کردن های بعدی آن عضو وجود ندارد، به عبارتی اگر کلاس فرزند دیگری از این کلاس فرزند به ارث گرفته شود، دیگر این عضو در آن کلاس قابل override کردن نخواهد بود، برای درک بهتر مطلب به کد زیر از MSDN توجه کتید :


using System;
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
}
class B : A
{
sealed override public void F()
{
Console.WriteLine("B.F");
}
override public void G()
{
Console.WriteLine("B.G");
}
}
class C : B
{
override public void G()
{
Console.WriteLine("C.G");
}
}

همانطور که مشاهده میکنید، امکان override کردن متد F در کلاس C وجود ندارد و در صورت انجام چنین کاری با خطای زیر مواجه خواهید شد:


'C.F()': cannot override inherited member 'B.F()' because it is sealed.

نکته : اعضای sealed در کلاس فرزند، توسط Intellisense نمایش داده نمیشوند،

اگر ابهامی بود بفرمایید تا توضیحات کاملتر ارائه کنم ،/

پ.ن : معادل کلیدواژه sealed در VB.Net برابر با NotInheritable میباشد./