PDA

View Full Version : تبادل اطلاعات بین دو کلاس



PC2st
دوشنبه 06 آذر 1385, 21:02 عصر
میخواستم بدونم که بهترین روش برای تبادل اطلاعات (مثلا فیلدها) بین دو کلاس چیه؟
یعنی اصلا میشه کاری کرد که فقط دو تا کلاس بتونند به یک فیلد خصوصی دسترسی داشته باشند؟
یا اصلا میشه از کلاسهای تو در تو استفاده کرد تا کلاسی بتواند به اطلاعات خصوصی کلاس زیر دستش، دسترسی داشته باشه؟
بطور مثال کد زیر را ببینید تا منظورم را بهتر متوجه شوید:



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

class Test2
{
private string _New;
}


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

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

PC2st
سه شنبه 07 آذر 1385, 19:09 عصر
لطفا اگر کسی میدونه، ممنون میشم راهنمائی‌ام کنه.

zizisol
چهارشنبه 08 آذر 1385, 14:32 عصر
چرا از مفهوم ارث بری استفاده نمی کنی؟(البته اگه منظور سوالت رو درست فهمیده باشم!)

PC2st
چهارشنبه 08 آذر 1385, 17:26 عصر
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 باشد، فقط مهم این است که این دو کلاس، هر دو میتوانند روی یک فیلد خصوصی (مخفی از دید دیگر کلاسها) تغییرات لازم را انجام دهند.

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

babalengderaz
یک شنبه 12 آذر 1385, 12:03 عصر
اگر از مفهوم کلاس های ارث بری شده استفاده میکنی بهتر است که نوع متغیرت را protected انتخاب کنی

PC2st
یک شنبه 12 آذر 1385, 19:59 عصر
ممنونم. با استفاده از دسترسی protected، فیلد مورد نظر تنها در خود کلاس قادر به دسترسی خواهد بود ولی من میخواهم توسط 2 کلاس به یک فیلد private دسترسی داشته باشم. یعنی فقط دو کلاس instance (نمونه سازی) شده بتوانند به یک فیلد بصورت مخفیانه، دسترسی داشته باشند.

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

PC2st
سه شنبه 14 آذر 1385, 21:48 عصر
آخرش نفهمیدم چطوری میشه همچین کاری انجام داد؟ (اصلا میشه!؟!!)

zizisol
پنج شنبه 16 آذر 1385, 10:54 صبح
وقتی یه فیلد رو PROTECTED می کنی برای دسترسی به اون باید یه PROPERTY بسازی.یه چیزی که بتونه روی متد تغییرات انجام بده.اگه شد حتما برات یه مثال هم می زنم.ولی اگه کتاب #C رو بخونی در مباحث ارث بری این مطلب گفته شده

PC2st
پنج شنبه 16 آذر 1385, 23:23 عصر
منظورم این نیست! اگر یک فیلد (چه از نوع دسترسی 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 تا نمونه ساخته شده از کلاس، فاقد یک فیلد خصوصی مجزا خواهند بود!

PC2st
جمعه 17 آذر 1385, 17:52 عصر
راه حل پیشنهادی ندارید!؟ اگر منظور سوالم رو خوب نرسوندم، بهم بگید ...

lomir
یک شنبه 19 آذر 1385, 11:39 صبح
می تونی از delegate استفاده کنی
http://msdn2.microsoft.com/de-de/library/900fyy8e(VS.80).aspx

PC2st
یک شنبه 19 آذر 1385, 16:55 عصر
ممنون. ولی منظور من این نیست (delegate مثل یک pointer برای متدهاست).

اَرژنگ
دوشنبه 20 آذر 1385, 01:52 صبح
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();
}
}

اَرژنگ
دوشنبه 20 آذر 1385, 02:41 صبح
وقتی یه فیلد رو PROTECTED می کنی برای دسترسی به اون باید یه PROPERTY بسازی.یه چیزی که بتونه روی متد تغییرات انجام بده.اگه شد حتما برات یه مثال هم می زنم.ولی اگه کتاب #C رو بخونی در مباحث ارث بری این مطلب گفته شده
منظورتان به جایه پروتکتد ، پابلیک میباشد؟

PC2st
دوشنبه 20 آذر 1385, 17:16 عصر
ممنونم. به جواب سوالم رسیدم :تشویق: کلید حل آن، استفاده از یک متد سازنده بود :لبخند:، ممنون.