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

نام تاپیک: تبادل اطلاعات بین دو کلاس

  1. #1
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491

    Tick تبادل اطلاعات بین دو کلاس

    میخواستم بدونم که بهترین روش برای تبادل اطلاعات (مثلا فیلدها) بین دو کلاس چیه؟
    یعنی اصلا میشه کاری کرد که فقط دو تا کلاس بتونند به یک فیلد خصوصی دسترسی داشته باشند؟
    یا اصلا میشه از کلاسهای تو در تو استفاده کرد تا کلاسی بتواند به اطلاعات خصوصی کلاس زیر دستش، دسترسی داشته باشه؟
    بطور مثال کد زیر را ببینید تا منظورم را بهتر متوجه شوید:


    class Test1
    {
    public void Change()
    {
    //How?
    }
    }

    class Test2
    {
    private string _New;
    }


    در کدهای فوق، من چیکار کنم که بتونم توسط تابع Change مقدار فیلد
    _New
    رو تغییر بدم! (حالا فرقی نمیکنه که تابع Change توی کلاس Test2 باشه و فیلد
    _New
    هم توی کلاس Test1) البته بخاطر کپسوله بودن مطمئنا نمیشه، ولی راهی وجود داره که یک فیلد برای کلاسهای Test1 و Test2 (هر دوی آنها) قابل تغییر باشد؟ بعبارت دیگر دنبال راهی میگردم که یک فیلد فقط برای دو کلاس قابل دسترسی باشد. حالا بهر طریقی که شده میخوام همچنین کاری انجام بشه و نحوه چیدمان محتویات کلاسها، برایم مهم نیست.

    ممنون میشم کمک کنید.

  2. #2
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    لطفا اگر کسی میدونه، ممنون میشم راهنمائی‌ام کنه.

  3. #3
    چرا از مفهوم ارث بری استفاده نمی کنی؟(البته اگه منظور سوالت رو درست فهمیده باشم!)

  4. #4
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    zizisol جان از شما ممنونم. کلاس مشتق شده یک فیلد از کلاس پایه رو ایجاد میکنه... (چون زیاد با کلاسهای مشتق شده یا پایه کار نکردم) آیا میشه به فیلد خصوصی کلاس پایه دسترسی داشته باشیم و مقدارش رو در لحظه اجرا تغییر بدیم؟ لطفا به من بگید.

    بهتره سوالم رو به شیوه بهتری بپرسم. با فرض اینکه کلاس Test1 دارای متد Change است و کلاس Test2 دارای خاصیت TheField است. میخواستم ببینم که چطوری میشه کاری کرد که متد Change از کلاس Test1 روی خاصیت TheField از کلاس Test2 تاثیر بگذارد. مثلا کدهای زیر را در نظر بگیرید:


     
    Test1 _tst1 = new Test1();
    Test2 _tst2 = new Test2();
    Console.WriteLine(_tst2.TheField);
    _tst1.Change();
    Console.WriteLine(_tst2.TheField);


    که خروجی کد فوق باید شبیه به زیر شود:

     
    Hello
    Bye


    در واقع فیلدی درون کلاس Test2 وجود دارد که مقدار اولیه آن Hello است و توسط متد Change از کلاس Test1 به مقدار Bye تغییر میابد. میخواستم بدونم به چه روشی میشه همچنین کاری رو انجام داد؟ حالا لازم نیست که فیلد مورد نظر حتما در کلاس Test2 باشد، فقط مهم این است که این دو کلاس، هر دو میتوانند روی یک فیلد خصوصی (مخفی از دید دیگر کلاسها) تغییرات لازم را انجام دهند.

    حالا فکر کنم منظورم را بهتر فهمیده باشید.

  5. #5
    اگر از مفهوم کلاس های ارث بری شده استفاده میکنی بهتر است که نوع متغیرت را protected انتخاب کنی

  6. #6
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    ممنونم. با استفاده از دسترسی protected، فیلد مورد نظر تنها در خود کلاس قادر به دسترسی خواهد بود ولی من میخواهم توسط 2 کلاس به یک فیلد private دسترسی داشته باشم. یعنی فقط دو کلاس instance (نمونه سازی) شده بتوانند به یک فیلد بصورت مخفیانه، دسترسی داشته باشند.

    راستش این مشکل وقتی برام پیش اومد که میخواستم یک property شبیه به ListBox.Items بسازم. property که دارای ایندکسر هست و همچنین دارای زیر توابع و کلاسهای داخلی دیگری هست و کلاسهای داخلیش باید باعث تغییرات در خود ListBox شوند.

  7. #7
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    آخرش نفهمیدم چطوری میشه همچین کاری انجام داد؟ (اصلا میشه!؟!!)

  8. #8
    وقتی یه فیلد رو PROTECTED می کنی برای دسترسی به اون باید یه PROPERTY بسازی.یه چیزی که بتونه روی متد تغییرات انجام بده.اگه شد حتما برات یه مثال هم می زنم.ولی اگه کتاب #C رو بخونی در مباحث ارث بری این مطلب گفته شده

  9. #9
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491

    Post

    منظورم این نیست! اگر یک فیلد (چه از نوع دسترسی protected چه private) توی کلاس A داشته باشم و بخواهم از کلاس B بهش دسترسی داشته باشم، یک راه حلش اینه که از یه property توی کلاس A استفاده کنم... ولی متاسفانه با ایجاد property، دیگه دسترسی به فیلد اون کلاس بصورت مخفیانه نیست!!! یعنی هر کلاسی میتونه اون فیلد رو از طریق property تغییر بده! ولی من میخواستم جوری باشه که فقط کلاس B بتونه به اون فیلد از کلاس A دسترسی داشته باشه. البته این کلمه دسترسی فقط یک کلاس، بی معنی نیست و توی سی شارپ وجود داره، منتهی فقط میتونم روی فیلد static عمل کنم، برای اینکه منظورم رو بهتر بیان کرده باشم به قطعه کد زیر توجه نمائید:

     
    class A
    {
    private static string _name;
    public B b = new B();
    class B
    {
    public void ChangeName()
    {
    _name = "HELL";
    }
    }
    }


    که متد ChangeName از کلاس B باعث تغییر فیلد
    _name
    از کلاس A میشه! برای دسترسی به متد فوق به شکل زیر استفاده میکنیم:


    A a = new A();
    a.b.ChangeName();


    ولی متاسفانه اشکالی که در اینجا وجود داره، اینه که فیلد
    _name
    بصورت استاتیک هست و اگه 1000 تا نمونه (instance مثل a) از این کلاس ساخته بشه، متد ChangeName تنها روی فیلد استاتیک کلاس اصلی، تغییرات رو اعمال میکنه و بقیه 1000 تا نمونه ساخته شده از کلاس، فاقد یک فیلد خصوصی مجزا خواهند بود!

  10. #10
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    راه حل پیشنهادی ندارید!؟ اگر منظور سوالم رو خوب نرسوندم، بهم بگید ...

  11. #11
    کاربر تازه وارد آواتار lomir
    تاریخ عضویت
    فروردین 1383
    پست
    60
    می تونی از delegate استفاده کنی
    http://msdn2.microsoft.com/de-de/lib...8e(VS.80).aspx

  12. #12
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    ممنون. ولی منظور من این نیست (delegate مثل یک pointer برای متدهاست).

  13. #13
    کاربر دائمی آواتار اَرژنگ
    تاریخ عضویت
    آبان 1384
    محل زندگی
    arjang8000@gmail.com
    پست
    2,736

    class OuterClass
    {
    private string s;
    // ...
    class InnerClass
    {
    OuterClass o_;
    public InnerClass( OuterClass o ) { o_ = o; }
    public string GetOuterString() { return o_.s; }
    }
    void SomeFunction()
    {
    InnerClass i = new InnerClass( this );
    i.GetOuterString();
    }
    }

  14. #14
    کاربر دائمی آواتار اَرژنگ
    تاریخ عضویت
    آبان 1384
    محل زندگی
    arjang8000@gmail.com
    پست
    2,736
    نقل قول نوشته شده توسط zizisol مشاهده تاپیک
    وقتی یه فیلد رو PROTECTED می کنی برای دسترسی به اون باید یه PROPERTY بسازی.یه چیزی که بتونه روی متد تغییرات انجام بده.اگه شد حتما برات یه مثال هم می زنم.ولی اگه کتاب #C رو بخونی در مباحث ارث بری این مطلب گفته شده
    منظورتان به جایه پروتکتد ، پابلیک میباشد؟

  15. #15
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491

    Thumbs up

    ممنونم. به جواب سوالم رسیدم کلید حل آن، استفاده از یک متد سازنده بود ، ممنون.

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

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