درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
حسین احمدی
امتیاز: 215942
رتبه:3
344
265
416
2833
حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر

آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت نوزدهم :: سازنده ها در وراثت، کلمه کلیدی protected و فیلدهای readonly

تاریخ 46 ماه قبل
نظرات 0
بازدیدها 2618
در قسمت قبل با کلمات کلیدی 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 ها آشنا خواهیم شد. ITPRO باشید

نویسنده : حسین احمدی
منبع : جزیره برنامه نویسی وب سایت توسینسو
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
برچسب ها
ردیف عنوان
1 دوره آموزشی .NET Framework و زبان برنامه نویسی سی شارپ - مقدمه
2 آموزش سی شارپ - قسمت اول :: معرفی و بررسی ابزارهای مورد نیاز دوره
3 آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش اول)
4 آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش دوم)
5 آموزش زبان سی شارپ - قسمت سوم :: آشنایی اولیه با محیط Visual Studio و نوشتن اولین برنامه
6 آموزش زبان سی شارپ - قسمت چهارم :: آشنایی با ساختار برنامه ها و کامپایلر زبان سی شارپ
7 آموزش زبان سی شارپ - قسمت پنجم :: آشنایی با دستورات کنسول و متغیرها
8 آموزش زبان سی شارپ - قسمت ششم :: نوع های داده اولیه
9 آموزش زبان سی شارپ - قسمت هفتم :: آشنایی با عملگرهای زبان سی شارپ
10 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش اول)
11 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش دوم)
12 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش سوم)
13 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش چهارم)
14 آموزش زبان سی شارپ - قسمت نهم :: آشنایی با آرایه ها و دستور foreach
15 آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش اول)
16 آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش دوم)
17 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت یازدهم :: مقدمه ای بر برنامه نویسی شئ گرا
18 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت دوازدهم :: آشنایی با کلاس، اشیاء و فضاهای نام
19 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت سیزدهم :: آشنایی با فیلدها و رفتارها
20 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت چهاردهم :: آشنایی با Property ها
21 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت پانزدهم :: آشنایی با سازنده ها و روش های ایجاد اشیاء
22 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت شانزدهم :: وراثت یا Inheritance
23 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هفدهم :: آشنایی با مفهوم Polymorphism
24 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هجدهم:: کلاس های abstract و sealed
25 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت نوزدهم :: سازنده ها در وراثت، کلمه کلیدی protected و فیلدهای readonly
26 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیستم :: کلاس های static و partial و Extension Method ها
27 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و یکم :: Reference Types و Value Types
28 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و دوم :: آشنایی با کاربرد interface ها
29 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و سوم :: آشنایی با مفاهیم Inversion of Control و Dependency Injection
30 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و چهارم :: آشنایی با مفهوم Type Casting و انواع Cast ها
31 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و پنجم :: آشنایی با operator overloading و تعریف cast ها
32 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و ششم :: مفاهیم boxing و unboxing
33 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هفتم :: قابلیت Generics
34 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هشتم :: نکات تکمیلی Generic ها، کلاس List و کلاس Dictionary
35 آموزش زبان سی شارپ -قسمت بیست و نهم (پایانی): استثناء ها (Exceptions) و مدیریت خطاها در سی شارپ
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید