کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

کلاس های تو در تو (nested class) در سی شارپ

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

می توان کلاسی را در دل کلاسی دیگر گنجاند. به کلاسی که داخل کلاسی دیگر ایجاد می شود، کلاس nested یا تودرتو می گویند. برای این منظور داخل کلاس موجود کلیک کرده و کد مورد نیاز را برای کلاس جدید وارد کنید، ابتدا کلید واژه ی class، سپس یک اسم و کاراکتر {} را تایپ کنید. حال، کل کلاس را انتخاب کنید. روی انتخاب راست کلیک کرده و گزینه ی Surround With... را انتخاب کنید. در لیستی که ظاهر می شود روی class دوبار کلیک کنید. در مثال زیر کلاسی به نام Inside داخل کلاس دیگری به نام Outside قرار گرفته

                
public class Outside
‎{‎
    public class Inside
‎    {
    }‎
‎}

طبق دستور بالا می توان هر تعداد کلاس که لازم است در کلاس های دیگر جای گذاری کرد. طریقه ی مدیریت و کنترل کلاس تودرتو هیچ تفاوتی با (مدیریت) یک کلاس عادی ندارد. برای مثال، می توان تمامی فیلدها، متدها و properties مورد نیاز را داخل کلاس تودرتو یا کلاس بیرونی (کلاس تودرتو) تعریف کرد. هنگامی که کلاسی را در کلاس دیگر جای گذاری می کنید، هیچ گونه ارتباط (برنامه ای) خاصی بین دو کلاس به وجود نمی آید : یعنی تنها به صرف قرار گرفتن یک کلاس در کلاس دیگر، کلاس تودرتو (nested class یا کلاس درونی) به اعضای کلاس بیرونی (nesting class) دسترسی فوری پیدا نخواهد کرد. در حقیقت، این دو کلاس از هم مجزا هستند. اسم کلاس تودرتو (کلاس درونی) بیرون از کلاس بیرونی قابل رویت نیست. برای دسترسی به کلاس تودرتو بیرون از کلاس بیرونی، باید اسم کلاس تودرتو را هر جایی که می خواهید از آن استفاده کنید، تعریف کنید. اگر می خواهید متغیر Inside را جایی درون برنامه ولی بیرون از Outside تعریف کنید، لازم است اسم آن را تعریف کنید.

مثال:

                
using System;‎

public class Outside
{‎
    public class Inside
    {‎
        public Inside()‎
        ‎{‎
        ‎    Console.WriteLine(" -= Inside =-");‎
        ‎}‎
    }‎

‎    public Outside()‎
‎    {‎
        Console.WriteLine(" =- Outside -=");‎
    }‎
}‎

public class Exercise
{‎
    static int Main()‎
    {‎
        Outside recto = new Outside();‎
        Outside.Inside ins = new Outside.Inside();‎

        return 0;‎
    }‎
‎}

نتیجه

=- Outside -=‎
‎ -= Inside =-

به این خاطر که هیچ گونه ارتباط خاصی بین کلاس درونی و کلاس بیرونی (دربردارنده) وجود ندارد، برای دسترسی به کلاس درونی در کلاس بیرونی، باید از اعضای ایستا (static members) آن استفاده کرد. به عبارت دیگر، می توانید همه ی اعضای کلاس درونی را که می خواهید در کلاس بیرونی دسترسی داشته باشید به عنوان ایستا تعریف کنید. به مثال زیر توجه کنید.

                
using System;‎

public class Outside
‎{‎
    public class Inside
    {‎
        public static string InMessage;‎
        public Inside()‎
        ‎{‎
            Console.WriteLine(" -= Insider =-");‎
            inMessage = "Sitting inside while it's raining";‎
        ‎}‎
        
        public static void Show()‎
        ‎{‎
            Console.WriteLine("Show me the wonderful world of C# ‎Programming");‎
        ‎}‎
    }‎

    public Outside()‎
    {‎
        Console.WriteLine(" =- The Parent -=");‎
    }‎
    
    public void Display()‎
    {‎
        Console.WriteLine(Inside.InMessage);‎
        Inside.Show();‎
    }‎
}‎

class Exercise
‎{‎
    static int Main()‎
    {‎
        Outside recto = new Outside();‎
        Outside.Inside ins = new Outside.Inside();‎
        Recto.Display();‎

        return 0;‎
    }‎
‎}

به همین نحو، برای دسترسی به کلاس بیرونی در کلاس درونی، می توان از اعضای ایستا کلاس بیرونی استفاده کرد ( کلیه ی اعضای کلاس بیرونی را که می خواهید در کلاس درونی دسترسی داشته باشید به عنوان ایستا تعریف کنید).

مثال:

                
using System;‎

public class Outside
‎{‎
    public class Inside
    ‎{‎
        public static string InMessage;‎
        public Inside()‎
        {‎
            Console.WriteLine(" -= Insider =-");‎
            InMessage = "Sitting inside while it's raining";‎
        ‎}‎
    
        public static void Show()‎
        {‎
            Console.WriteLine("Show me the wonderful world of C# ‎Programming");‎
        ‎}‎
    
        public void FieldFromOutside()‎
        {‎
            Console.WriteLine(Outside.OutMessage);‎
        }‎
    ‎}‎

    private static string OutMessage;‎
    
    public Outside()‎
    ‎{‎
        Console.WriteLine(" =- The Parent -=");‎
        OutMessage = "Standing outside! It's cold and raining!!";‎
    ‎}‎
    
    public void Display()‎
    ‎{‎
        Console.WriteLine(Inside.InMessage);‎
        Inside.Show();‎
    ‎}‎
‎}‎

public class Exercise
‎{‎
    static int Main()‎
    {‎
        Outside recto = new Outside();‎
        Outside.Inside Ins = new Outside.Inside();‎
        ‎Recto.Display();‎
        Console.WriteLine();‎
        Ins.FieldFromOutside();‎

        return 0;‎
    }‎
}

نتیجه

 =- The Parent -=‎
  ‎-= Insider =-‎
Sitting inside while it's raining
Show me the wonderful world of C# Programming
Standing outside! It's cold and raining!!

همچنین می توان به جای اعضای ایستا، اگر می خواهید به اعضای کلاس درونی در کلاس بیرونی دسترسی داشته باشید، متغیر کلاس درونی را در کلاس بیرونی تعریف کنید و بر عکس (عکس این قضیه را برای دسترسی به اعضای کلاس بیرونی در کلاس درونی پیاده کنید).

مثال:

                
using System;‎

public class Outside
‎{‎
    ‎// A member of the nesting class‎
    private string OutMessage;‎
    
    // The nested class‎
    public class Inside
    ‎{‎
        ‎// A field in the nested class‎
        public string InMessage;‎
        ‎‎
        // A constructor of the nested class‎
        public Inside()‎
        ‎{‎
            Console.WriteLine(" -= Insider =-");‎
            this.InMessage = "Sitting inside while it's raining";‎
        ‎}‎
        ‎
        ‎// A method of the nested class‎
        public void Show()‎
        ‎{‎
            ‎// Declare a variable to access the nesting class‎
            Outside outsider = new Outside();‎
            Console.WriteLine(outsider.OutMessage);‎
        ‎}‎
    } // End of the nested class‎

    ‎// A constructor of the nesting class‎
    public Outside()‎
    ‎{‎
        this.OutMessage = "Standing outside! It's cold and raining!!";‎
        Console.WriteLine(" =- The Parent -=");‎
    ‎}‎
    
    ‎// A method of the nesting class‎
    public void Display()‎
    ‎{‎
        Console.WriteLine(insider.InMessage);‎
    ‎}‎
    
    ‎// Declare a variable to access the nested class‎
    Inside insider = new Inside();‎
‎}‎

public class Exercise
‎{
    static int Main()‎
    {‎
        Outside recto = new Outside();‎
        Outside.Inside Ins = new Outside.Inside();‎
        Ins.Show();‎
        Recto.Display();‎

        return 0;‎
    }‎
‎}

نتیجه

-= Insider =-‎
‎=- The Parent -=‎
-= Insider =-‎
-= Insider =-‎
=- The Parent -=‎
Standing outside! It's cold and raining!!‎
Sitting inside while it's raining

کلاسی به عنوان فیلد

مثل تمامی متغیرهایی که تاکنون به کار برده ایم، می توان یک کلاس یا ساختار را متغیر عضو کلاسی دیگر کرد. برای این که بتوانید کلاس دیگری را در کلاس خود به کار ببرید، در وهله ی اول لازم است آن کلاس را در دسترس داشته باشید. هم می توانید از کلاس های آماده ی C# برای این منظور استفاده کنید، هم می توانید کلاس خود را ایجاد کنید.

مثال:

                
public class Point
‎{‎
‎    internal short x;‎
‎    internal short y;‎
‎}

فیلد در حقیقت متغیر عضوی است که به جای نوع اولیه (primitive type) از کلاس دیگری ساخته می شود. برای استفاده از یک کلاس به عنوان متغیر عضو کلاسی دیگر، کافی است متغیر آن را تعریف کنید. به مثال زیر توجه کنید.

                
public class Point
‎{‎
‎    internal short x;‎
‎    internal short y;‎
‎}‎

public class CoordinateSystem
‎{‎
    public Point start;‎
‎}

پس از تعریف کلاسی به عنوان عضو متغیر کلاس دیگر، می توان از متغیر مزبور به طور منظم استفاده کرد. به این خاطر که عضو مورد نظر یک کلاس است، که به عنوان (یک) ارجاع (reference) معرفی شده، قوانینی وجود دارد که هنگام استفاده از آن باید رعایت کرد. پس از تعریف متغیر عضو، باید مطمئن شوید که حافظه ی کافی به آن تخصیص داده شده است. همچنین لازم است متغیر مذکور صحیح و به طور مقتضی مقداردهی (اولیه) شده باشد. در غیر این صورت، هنگام ترجمه ی (compile) برنامه با error مواجه می شوید.

1394/07/27 15112 5823
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...