آموزش برنامه نویسی

آموزش سی شارپ

آموزش سی شارپ

پربیننده ترین مطالب
پیوندهای روزانه

در قسمت قبل با کلمات کلیدی abstract و sealed آشنا شدیم. در این قسمت و قسمت بعد تصمیم دارم برخی نکات تکمیلی که از بخش برنامه نویسی شئ گرا مانده را خدمت دوستان آموزش بدم. مواردی که در این بخش با آنها آشنا خواهید شد به شرح زیر است:

  1. سازنده ها در کلاس های فرزند و پدر
  2. سطح دسترسی protected
  3. مخفی کردن متدها با کلمه کلیدی new
  4. فیلدهای Readonly

سازنده هه در کلاس های فرزند و پدر


در قسمت های قبلی آموزش با مفهوم سازنده و کاربرد آن ها در کلاس ها آشنا شدیم. چند نکته در مورد سازنده ها در کلاس های فرزند وجود دارد که در این بخش آنها را بررسی می کنیم. فرض کنید کلاس پایه ای داریم که به صورت زیر تعریف شده است:

public class Human
{
    public Human(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

در ادامه کلاس Employee را به صورت زیر تعریف می کنیم:

public class Employee : Human
{
            
}

اما کد بالا منجر به وقوع خطا خواهد شد، دلیل آن هم عدم وجود سازنده پیش فرض در کلاس پایه می باشد. اگر به خاطر داشته باشید سازنده پیش فرض، سازنده ای است که هیچ پارامتری به عنوان ورودی دریافت نمی کند:

i1


برای رفع این مشکل دو راه وجود دارد، یکی تعریف سازنده پیش فرض در کلاس والد و روش دوم پیاده سازی سازنده ای برای کلاس فرزند که پارامتر های مورد نیاز برای کلاس والد را گرفته و به سازنده کلاس والد ارسال می کند. اگر از بخش های قبلی به خاطر داشته باشید، با مبحثی در سازنده آشنا شدیم به نام زنجیره سازنده ها یا Constructor Chaining. در مثال بالا، باید از قابلیت Constructor Chaining استفاده کرد، اما سازنده کلاس والد را صدا زد. کلاس Employee را به صورت زیر تغییر می دهیم:

public class Employee : Human
{
    public Employee(string firstName, string lastName) : base(firstName, lastName)
    {
    }
}

همانطور که مشاهده می کنید، سازنده ما دو پارامتر دریافت می کند و هر دوی این پارامترها را به عنوان ورودی به سازنده کلاس والد ارسال می کند. کلمه base در اینجا به سازنده تعریف شده در کلاس والد اشاره می کند. حال فرض کنید خصوصیت جدیدی به نام JobPosition به کلاس Employee اضافه کردیم و میخواهیم این خصوصیت از طریق سازنده مقدار دهی شود. کافیست کد کلاس Employee را به صورت زیر تغییر دهیم:

public class Employee : Human
{
    public string JobPosition { get; set; }

    public Employee(string firstName, string lastName, string jobPosition) : base(firstName, lastName)
    {
        JobPosition = jobPosition;
    }
}

همانطور که مشاهده می کنید، پارامتر سومی به نام jobPosition به سازنده اضافه کردیم و داخل سازنده کلاس فرزند خصوصیت JobPosition را مقدار دهی کردیم، اما مقادیر firstName و lastName به سازنده کلاس والد ارسال شد تا برای برای مقدار دهی خصوصیات FirstName و LastName از کد کلاس والد استفاده کنیم.


سطح دسترسی protected


در بخش های قبلی در مورد سطوح دسترسی مختلف صحبت کردیم و گفتیم که هر سطح دسترسی مشخص می کند یک کلاس یا اعضای کلاس تا چه سطحی از برنامه دسترسی داشته باشند. یک سطح دسترسی باقی ماند به نام protected که نیاز به بررسی مفهوم وراثت داشت. کلاس های زیر را در نظر بگیرید:

public class A
{
    private int id;
}

public class B : A
{
            
}

در کد بالا، فیلد id که در کلاس A تعریف شده، خارج از کلاس B قابل دسترس نخواهد بود، زیرا این فیلد به صورت private تعریف شده است:

i2


حتی در کلاس B که فرزند کلاس A می باشد، این فیلد در دسترس نمی باشد. یک راه حل تعریف فیلد id به صورت public یا internal است. البته دقت کنید در صورت تعریف کردن فیلد id به صورت internal در صورتی کلاس B به آن دسترسی خواهد داشت که محل تعریف کلاس A و B در یک پروژه باشد. اما در صورتی که بخواهیم فیلد id تنها در کلاس های فرزند و خود کلاس A در دسترس باشد، باید سطح دسترسی فیلد id را protected تعریف کنیم. با این کار قابلیت دسترسی به فیلد id را از کلاس B خواهیم داشت. کلاس A را به صورت زیر تغییر می دهیم:

public class A
{
    protected int id;
}

یک حالت دیگر نیز وجود دارد و ترکیب استفاده از protected و internal است. در حالت بالا، در صورتی که کلاس A به صورت public تعریف شده باشد و ما خارج از پروژه ای که کلاس A تعریف شده کلاسی بسازیم و از کلاس A مشتق کنیم، به فیلد id دسترسی خواهیم داشت. برای اینکه فیلد id تنها از کلاس هایی که داخل همان پروژه ای که کلاس A وجود دارد تعریف شده اند و کلاس A مشتق شده اند قابل دسترسی باشد، دسترسی آن را از نوع protected internal تعریف می کنیم:

public class A
{
    protected internal int id;
}

دقت کنید که می توان protected internal را به صورت internal protected نیز نوشت و هیچ تفاوتی در عملکرد آنها وجود ندارد.

*در توضیحات بالا، منظور از دسترسی خارج از پروژه، پروژه های است که به پروژه ما Reference داده می شوند، منظور از Reference دادن استفاده از کدهای موجود در یک پروژه می باشد. در بخش های بعدی روش تعریف Solution هایی که بیش از یک پروژه دارند و Reference دادن آنها به هم را بررسی خواهیم کرد.


مخفی سازی اعضاء بوسیله کلمه کلیدی new


در بخش polymorphism روش override کردن متدها و خصوصیات را گفتیم. حالتی وجود دارد که یک عضو کلاس از نوع virtual تعریف نشده، اما در کلاس فرزند عضوی همنام یکی از اعضای کلاس پدر تعریف شده است. به مثال زیر توجه کنید:

public class A
{
    public void PrintMessage()
    {
        Console.WriteLine("From class A");
    }
}

public class B : A
{
    public void PrintMessage()
    {
        Console.WriteLine("From class B");
    }
}

به تصویر زیر دقت کنید:

i3


در تصویر بالا مشاهده می کنید که کامپایلر به شما اخطار می دهد که برای مخفی سازی متد در کلاس فرزند بهتر است از کلمه کلیدی new استفاده کنید. متد PrintMessage در کلاس B را به صورت زیر تغییر می دهیم:

public class B : A
{
    public new void PrintMessage()
    {
        Console.WriteLine("From class B");
    }
}	

با کلمه کلیدی new، کامپایلر دیگر اخطاری به شما نمی دهد. دقت کنید که کلمه کلیدی new کاملاً با override کردن متدها تفاوت دارد. کد زیر پیغام From Class A را چاپ می کند، اما در صورت override کردن متد در کلاس B پیغام From class B چاپ می شد:

A obj = new B();
obj.PrintMessage();

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


فیلدهای readonly


فیلدهای readonly فیلدهایی هستند که تنها در سازنده می توان آنها را مقدار دهی کرد و خارج از سازنده شما امکان مقدار دهی آن ها را نخواهید داشت و تنها می توان از مقدار آنها استفاده کرد:

public class A
{
    private readonly int value;

    public A(int value)
    {
        this.value = value;
    }
}

در کلاس بالا فیلد value از نوع readonly تعریف شده است، در صورتی که جایی خارج از سازنده شما value را مقدار دهی کنید با پیغام خطا مواجه خواهید شد:

i4


در قسمت بعدی با کلاس ها و اعضای static، کلاس های partial و Extension Method ها آشنا خواهیم شد.

منبع:programming.itpro.ir
  • متین تیماسی ، مبین خسروی و عمران جودکی

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی