PDA

View Full Version : سوال: دسترسی به اعضای کلاس پایه توسط شی نمونه سازی شده



alireza_tavakol
شنبه 31 مرداد 1388, 18:29 عصر
اگه من دو تا کلاس داشته باشم به اسم base و derived

اگه توی کلاس base یک فیلد داشته باشم به اسم a و توی کلاس derived هم یک فیلد به اسم a داشته باشم

اگه کلاس derived از کلاس base ارث بری داشته باشه

اگه من یک شی از کلاس derived نمونه سازی کنم به اسم X

چطوری میشه توسط شی X به فیلد a کلاس base دسترسی داشته باشم

در حالت عادی X.a=10 به فلید a موجود در کلاس derived دسترسی دارم نه فیلد a که در base تعریف شده

shahab_ss
شنبه 31 مرداد 1388, 21:53 عصر
http://www.dotnetspider.com/resources/30678-Use-base-keyword-C.aspx

alireza_tavakol
یک شنبه 01 شهریور 1388, 00:47 صبح
http://www.dotnetspider.com/resources/30678-Use-base-keyword-C.aspx

لینکی دوست عزیزمون ارسال کردن شامل محتویات زیر میشه (نحوه استفاده از کلمه base)

class A
{
int i;
A(int n, int m)
{
x = n;
y = m
Console.WriteLine("n="+x+"m="+y);
}
}

class B:A
{
int i;
B(int a, int b):base(a,b)//calling base class constructor and passing value
{
base.i = a;//passing value to base class field
i = b;
}
public void Show()
{
Console.WriteLine("Derived class i="+i);
Console.WriteLine("Base class i="+base.i);
}
}

class MainClass
{
static void Main(string args[])
{
B b=new B(5,6);//passing value to derive class constructor
b.Show();
}
}

با این مثال می شه نحوه دسترسی به اعضای کلاس base رو از بدنه کلاس derived نشان داد

ولی سوال من اینه

چطوری میشه توسط شی X که از کلاس derived نمونه سازی شده است به فیلد a کلاس base دسترسی داشته باشم

alireza_tavakol
دوشنبه 02 شهریور 1388, 02:31 صبح
لطفا" ، دوستانی اطلاعاتی درباره سوال مطرح شده دارند ، راهنمایی بفرمایند

با تشکر

SMRAH1
دوشنبه 02 شهریور 1388, 03:15 صبح
سلام

1) با توجه به اینکه برنامه نویسی در کلاس مشتق شده دوباره متغیر کلاس پایه را تعریف کرده است،قطعا منظوری داشته و نباید دیگر بخواهیم دسترسی به آن متغیر کلاس پایه داشته باشیم (اگر مورد خواصی در این زمینه سراغ دارید که نیاز به این دسترسی است ،لطفا برای کسب تجریه بنده نیز ذکر کنید).
2) با این حال دو راه است.اول اینکه در کلاس دوم ،یک property برای دسترسی به متغیر کلاس اول معرفی کنیم.دوم : با توجه به تعریف زیر :

public class A
{
public int i;
public A()
{
i = 0;
}

public string GetStringA()
{
return "Class A : i = " + i.ToString();
}
}

public class B : A
{
public int i;
public B()
{
base.i = 1;
i = 0;
}

public string GetStringB()
{
return "Class B : i = " + i.ToString();
}
}دستور زیر مطلوب شما است :

B b = new B();
((A)b).i = 2;
MessageBox.Show(b.GetStringA() + "\n" + b.GetStringB());موفق باشید

majid325
دوشنبه 02 شهریور 1388, 04:15 صبح
2 تا فیلد هم نام که نمیشه داشت، اصلا چجوری میخوای از هم تمایزشون بدی؟
اینکه به فیلد a کلاس پدر نمیتونی دسترسی داشته باشی (در سناریو شما) یه قابلیت هست.

alireza_tavakol
دوشنبه 02 شهریور 1388, 12:21 عصر
با تشکر از راهنمای SMRAH1
مشکل من حل شد
علت طرح این سناریو



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


یک کلاس به اسم کارمند دارم

یک کلاس به اسم تنخواه گران دارم(ارث بری از کلاس کارمند داره)*

حالا من فرض رو بر این گذاشتم که برای تمام کارمندان شی ای از کلاس کارمندان نمونه سازی کنم به جز تنخواه گردانان سیستم که از کلاس تنخواه واسشون شی در نظر میگیرم

حالا اگه کلاس کارمندان متدی برای چاپ اطلاعات کلی (نام ، نام خانوادگی و...) هر کارمند داشته باشه و کلاس تنخواه گردان متدی برای چاپ اطلاعات کلی (نام ، نام خانوادگی ، میزان اعتبار و ..) هر تنخواه داشته باشه (متد های چاپ اطلاعات در کلاس کارمند و تنخواه هم نام انتخاب شده اند تا استاندارد تر باشه)

نتیجه : من لازم داشتم بتوانم توسط شی تنخواه اطلاعات کلی را چاپ کنم در حالت عادی آخرین ویرایش override شده هر متد اجرا میشه یعنی همیشه متد چاپ اطلاعات (نام ، نام خانوادگی ، میزان اعتبار و ..) در دسترسه ولی در جایگاه خواصی می خواستم متد چاپ اطلاعات کلی (نام ، نام خانوادگی و...) را فراخوانی کنم

به نظر شما راه دیگری برای رسیدن به این مطلوب وجود دارد؟
__________________________________________________ ____
* تنخواه گران ها : نوعی از کارمندان هستند با این تفاوت که عملیات خواص مالی (خرید و اختصاص اعتبار ) را باید پوش دهند

SMRAH1
دوشنبه 02 شهریور 1388, 13:03 عصر
سلام

با برداشت من از توضیحات شما،اینترفیس برای همین مواقع کاربرد داره(در اینترفیس یک تابع همنان تابع کلاس پایه داشته باشید که اطلاعات مد نظرتون را چاپ کنه).

در ضمن من متوجه این نکته نشدم که :

من لازم داشتم بتوانم توسط شی تنخواه اطلاعات کلی را چاپ کنم در حالت عادی آخرین ویرایش override شده هر متد اجرا میشه یعنی همیشه متد چاپ اطلاعات (نام ، نام خانوادگی ، میزان اعتبار و ..) در دسترسه ولی در جایگاه خواصی می خواستم متد چاپ اطلاعات کلی (نام ، نام خانوادگی و...) را فراخوانی کنم
شما می خواهید که با یک متد (همنام که override شده) در هر کدام از این اشیا یک خروجی متفاوت داشته باشد یا نه؟؟؟!

موفق باشید

alireza_tavakol
دوشنبه 02 شهریور 1388, 13:43 عصر
سلام



با برداشت من از توضیحات شما،اینترفیس برای همین مواقع کاربرد داره(در اینترفیس یک تابع همنان تابع کلاس پایه داشته باشید که اطلاعات مد نظرتون را چاپ کنه).



من از اینترفیس بلدم این طوری استفاده کنم ! لطفا اگه قابلیتی داره که بتونه مسئله من را راحت تر حل بکنه بفرمایید

یک اینترفیس تعریف کنم به اسم "امور مربوط به چاپ".
داخل اینترفیس سیگنچر "چاپ اطلاعات کلی" را تعریف کنم.
کلاس کارمند و تنخواه گردان این اینترفیس رو پشتیبانی ( پیاده سازی کنند )
حالا در کلاس کارمند متد "چاپ اطلاعات کلی" بدنه ای داشته باشد که (نام ، نام خانوادگی و...) را چاپ کند
و در کلاس تنخواه گردان متد "چاپ اطلاعات کلی" بدنه ای داشته باشد که (نام ، نام خانوادگی ، میزان اعتبار و ..) را چاپ کند
در نهایت یک شی به اسن X از نوع اینترفیس "امور مربوط به چاپ" بسازم و به شی ای از کلاس کارمند منتسب کنم یا به شی ای از کلاس تنخواه منتسب کنم
از این به بعد هر گاه بگم "چاپ اطلاعات کلی".X خود کامپایلر تشخیص بده که نسبت به کارمند بودن یا تنخواه بودن متد مربوطه را اجرا کند

در صورتی که این سناریو پاسخ گو مشکل من نیست چون تنخواه گردان ها نوعی از کارمندان هستند پس من لازم دارم هر دو نوع حالت چاپ را داشته باشم {(نام ، نام خانوادگی و...)برای وقتی که به عنوان یک کارمند به تنخواه گردان ها نگاه میشود / و (نام ، نام خانوادگی ، میزان اعتبار و ..) برای مواقعیی که به عنوان یک تنخواه گران به یک کارمند نگاه می شود}

نکته اول : در ضمن اگه از اصطلاح virtual و override استفاده شده باشد روش گفته شده کارایی ندارد پس من نباید متد "چاپ اطلاعات کلی" را برای کارمندان مجازی تعریف کنم و در تنخواه گردان منسوخ نمایم
نکته دوم : متد "چاپ اطلاعات کلی" در تعداد پارامتر های ورودی و نوع خروجی در هر دو حالت یکسان میباشد و فقط بدنه متفاوتی دارد

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