نمایش نتایج 1 تا 7 از 7

نام تاپیک: نشان دادن یک متد در کلاس های دیگر

  1. #1

    نشان دادن یک متد در کلاس های دیگر

    سلام دوستان
    من 3 تا کلاس دارم و می خوام متود هام رو به صورت private تعریف کنم از طرفی می خوام متود های privateرو توی یکی از کلاس هام بتونم ببینم
    یادم توی C++‎ کلاس های friend را تعریف می کردیم
    حالا اگه هر کلاس یه dll باشه برای استفاده از متود های private باید چی کار کنم
    شنیدم باید از protected به جای private استفاده کرد توی اینترنت و msdn جستجو کردم
    کد زیر رو پیدا کردم ولی جوابگو نیست می شه راهنمایی کنید؟؟؟؟
    کد HTML:
    // cs_friend_assemblies.cs
    // compile with: /target:library
    using System.Runtime.CompilerServices;
    using System;
    [assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
    // internal by default
    class Class1 
    {
        public void Test() 
        {
            Console.WriteLine("Class1.Test");
        }
    }
    // public type with internal member
    public class Class2 
    {
        internal void Test() 
        {
            Console.WriteLine("Class2.Test");
        }
    }

    کد HTML:
    // cs_friend_assemblies_2.cs
    // compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
    public class M 
    {
        static void Main() 
        {
            // access an internal type
            Class1 a = new Class1();
            a.Test();
            Class2 b = new Class2();
            // access an internal member of a public type
            b.Test();
        }
    }

  2. #2
    VIP آواتار Sajjad.Aghapour
    تاریخ عضویت
    مهر 1386
    محل زندگی
    اهل کاشانم .. روزگارم بد نیست
    پست
    1,265

    نقل قول: friend

    بستگی داره شما می خواهید از کدهای خود در یک اسمبلی استفاده کنید یا به صورت گسترده...

    اگر درست خاطرم باشه مفهوم friend در ++C معادل مفهوم internal در اینجاست.شما وقتی از internal استفاده میکنید که میخواهید یک object را محدود به یک اسمبلی کنید و فقط در همان اسمبلی از آن استفاده کنید.یعنی میتونیم اینگونه بگیم : "محافظت شده در سطح اسمبلی"
    اگر هم دقت کنید:

    [assembly:InternalsVisibleTo("cs_friend_assemblies_ 2")]

    این attribute سطح internal را برای اسمبلی cs_friend_assemblies_2 نیز قابل مشاهده میکنه....

    protected در ارث بری خودش رو نشون میده.شما از این کلمه وقتی استفاده میکنید که بخواهید یک object رو در دسترس کلاس های وارث قرار بدید...

    public هم که گویا هست و نیازی به توضیح نداره...

    سوالتون یه خورده نامفهوم بود.به خاطر همین توضیحات رو (هرچند خیلی کوتاه) دادم تا برحسب نیازتون بهترین گزینه رو انتخاب کنید....
    Close your eyes, take a deep breath, click your heels three times, and say, "There's no better thing than Inversion of Control and Dependency Injection, generic specialization, the decorator pattern, chains of responsibilities, and extensible software."

  3. #3
    کاربر دائمی آواتار cardano7
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    کارتون خواب
    پست
    473

    نقل قول: نشان دادن یک متد در کلاس های دیگر

    سلام
    گقته میشه #C در جهت Pure OO داره حرکت می کنه و نمی خواد با friend کدهاش رو کثیف کنه.
    شما چند راه دارید که هیچ کدوم ممکنه اونی نباشه که دوست دارید!
    1- استفاده از Internal
    2- تغییر آناتومی برنامه طوری که نیاز به این کار نباشه.
    3- اگه هدف یک تعداد کمی عضو باشه میشه اونا رو از طریق یک متغیر(برای توابع: یک delegate) از خارج کلاس اونا رو به هم مربوط کنید.

    به هر حال سال هاست که برنامه نویسان #C بدون friend کلاس می نویسند. لابد این keyword خیلی حیاتی نیست!

  4. #4

    نقل قول: friend


    [assembly:InternalsVisibleTo("cs_friend_assemblies_ 2")]

    این attribute سطح internal را برای اسمبلی cs_friend_assemblies_2 نیز قابل مشاهده میکنه....
    اینی که می گید درست
    ولی جوابگو نیست.یعنی وقتی متود یا کلاسم رو توی اسمبلی اول به صورت internal تعریف می کنم دیگه توی اسمبلی دوم نمی شناسه

  5. #5
    کاربر دائمی آواتار cardano7
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    کارتون خواب
    پست
    473

    نقل قول: friend

    نقل قول نوشته شده توسط com_engineer_ab مشاهده تاپیک

    [assembly:InternalsVisibleTo("cs_friend_assemblies_ 2")]

    این attribute سطح internal را برای اسمبلی cs_friend_assemblies_2 نیز قابل مشاهده میکنه....
    اینی که می گید درست
    ولی جوابگو نیست.یعنی وقتی متود یا کلاسم رو توی اسمبلی اول به صورت internal تعریف می کنم دیگه توی اسمبلی دوم نمی شناسه
    پس اون راه استفاده از delegate ی که public شده رو امتحان کنید.

  6. #6

    نقل قول: friend

    پس اون راه استفاده از delegate ی که public شده رو امتحان کنید.[/quote]
    راستش رو بخواین من از delegate هیچی نمیدونم یه منبع خوب فارسی سراغ دارین؟؟

  7. #7
    کاربر دائمی آواتار cardano7
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    کارتون خواب
    پست
    473

    نقل قول: friend

    نقل قول نوشته شده توسط com_engineer_ab مشاهده تاپیک
    راستش رو بخواین من از delegate هیچی نمیدونم یه منبع خوب فارسی سراغ دارین؟؟
    بیا خودم منبعم!

    یادته که توی C می شد یک تابع را با آدرسش صدا زد؟

    myPointer=clrscr;
    myPointer(); //calls clrscr


    حالا تو C#‎‎‎‎‎‎ این کار یک مقدار قاعده مند تر شده. یعنی یک delegate می سازیم که نشون میده چه نوع قالبی از توابع رو پشتیبانی می کنه:
     public delegate void Print (String s);

    در حقیقت یک delegate نوعی تعیریف type برای متغیرهایی هست که به جای داده، مقدارشون برابر یک تابع هست.

    البته قبلش مطابق اون قالب چند تابع داریم که نوع و ارگومان هاشون با اون قالب هم خونی داره:
     public static void toConsole (String str)
    {
    Console.WriteLine(str);
    }

    public static void Display(Print WriteToFile)
    {
    pMethod("This should be displayed in the console");
    }


    حالا تو برنامه ی خودمون میاییم و از اون delegate یک یا چند نمونه می سازیم. و به delegate ها مقدار می دهیم. تابع مورد نظر رو به اون نمونه از delegate نسبت می دیم. بعد نمونه از delegate ساخته شده را صدا می زنیم. می بینیم که اون تابع صدا زده میشه.
        public static void Main()
    {
    Print s = new Print (toConsole);
    Print v = new Print (toFile);
    Display (s);
    Display (v);
    }


    delegate چیز خوبیه. حریم و این جور چیزا سرش نمیشه. public یا private بودن تابع براش مهم نیست. هر چیزی رو که بهش نسبت داده شده باشه رو می تونه صدا بزنه.

    اگه این توضیحات کفایت نکرد، ببخشید که وسعمون در همین حد بود. خواستی می تونی google کنی. مطلب زیاده. اگه هم خواستی بیشتر گیج بشی می تونی مثل همیشه سراغ توضیحات MSDN بری.
    البته delegate کاربردهای دیگری هم داره. که توی این پست بحث شد.

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •