PDA

View Full Version : گفتگو: بررسی ارث بری و تعریف یه شی ء



maryshayegh
چهارشنبه 13 بهمن 1389, 14:46 عصر
سلام ؛ خدا قوت
یه بررسی در خصوص تعریف یک شی ء از کلاسA و ارث بری از کلاسA ،

اینکه هر کدوم چه قابلیتهایی دارند و سطح دسترسیشون تا چه حده ؟


"نتیجه ی واضحی از سرچ نگرفتم "
مرسی

man_iran
چهارشنبه 13 بهمن 1389, 15:07 عصر
سلام
اگر مثلا شما کلاسی با نام A داشته باشید حالا برای دو حالتی که گفتید، چنین شرایطی ایجاد می شه:
شی از کلاس A -----> شما وقتی از کلاس A شی ایجاد می کنید یعنی یک کپی از کلاس A را در اختیار دارید نه خود کلاس A. پس اگر تغییری ایجاد کنید یا مقدار دهی کنید فقط روی شی شما اعمال می شه نه کلاس A. از نظر سطح دستری هم، فقط به اشیا عمومی (public) دستری دارید.
ارث بری از کلاس A -------> در این حالت شما خود کلاس A را در اختیار دارید پس اگر تغییر یا مقداردهی کنید مستقیما بر روی خود کلاس اعمال می شه. از نظر سطح دستری هم شما به تمام اشیا آن دسترسی دارید بجر آنهایی که خصوصی معرفی شده باشند (private)

maryshayegh
چهارشنبه 13 بهمن 1389, 16:10 عصر
سلام
تعریف شی ء: از نظر سطح دستری هم، فقط به اشیا عمومی (public) دستری دارید.
ارث بری: از نظر سطح دستری هم شما به تمام اشیا آن دسترسی دارید بجر آنهایی که خصوصی معرفی شده باشند (private)

با تشکر از پاسختون ؛برای من مفید بود ؛ در تکمیل حرفتون ، ما میتونیم به متغیرهای Private و Protected هم دسترسی داشته باشیم البته به شرطی که Protected رو به صورت internal تعریف کنیم و اینکه با تعریف یک متغیر از نوع public با متدهای get , set میتوانیم به private نیز دسترسی داشته باشیم .
درسته دیگه ؟

یه سوال دیگه در همین رابطه ؛ من یه classlibrary تعریف کردم و متغیر هایی رو در اونجا مقداردهی کردم ، الان میخوام به متغیر های این کتابخانه ام دسترسی داشته باشم ، آیا علاوه بر using کردن اون کتابخانه به کلاس اصلی ، باید در کلاس اصلی ، از کلاس کتابخانه هم ارث بری داشته باشم ؟
راستش یه تمرین داشتم ولی هر چه کردم که با Add refrence به کتابخانه ام وصل بشم نشد !!! به همین خاطر نتونستم تست کنم .
اگه اشکال برقراری ارتباطم رو هم بگین ، تا خودم برم سراغش ممنون میشم .

ممنون از پاسختون

man_iran
چهارشنبه 13 بهمن 1389, 16:40 عصر
بله درست می گید.

وقتی شما کتابخانه ای داشته باشید (dll.*) و با استفاده از using آن را به پروژه خود اضافه می کنید انگار کلاس موجود در کتابخانه را به پروژه خود اضافه می کنید. حالا اگر کلاس توی کتابخانه پابلیک باشه برای اینکه به آن دسترسی داشته باشید باید از آن شی درست کنید. البته بستگی به استفاده ممکنه بعضی مواقع نیاز به ارث بری داشته باشه
اگر ممکنه بیشتر در مورد پروژتون توضیح بدید.

ACorvinus
چهارشنبه 13 بهمن 1389, 16:47 عصر
سلام.

رفیق سطوح های دسترسی از این قراره:

private: کمترین سطح دسترسی که فقط اعضای کلاس میتونن بهش دسترسی داشته باشن.
internal: به دسترسی ای گفته میشه که فقط اعضای یک پروژه (Assembly) به آن داشته باشند.
protected: این دسترسی برای اعضایی امکان پذیر هست که از ولد ارث بری می کنند. (چه در پروژه جاری و چه در سایر پروژه ها).
protected internal: همانند دسترسی فوق می باشد با این توجه که فقط اعضای مشتق شده پروژه جاری بدان دسترسی دارند.
public: بیشترین سطح دسترسی می باشد یعنی همه اعضا از هر پروژه ای بدان دسترسی دارند.


من یه classlibrary تعریف کردم و متغیر هایی رو در اونجا مقداردهی کردم ، الان میخوام به متغیر های این کتابخانه ام دسترسی داشته باشم ، آیا علاوه بر using کردن اون کتابخانه به کلاس اصلی ، باید در کلاس اصلی ، از کلاس کتابخانه هم ارث بری داشته باشم ؟

برای دسترسی به متغیرهای داخل ClassLibrary شما ابتدا باید با انتخاب منوی Project و گزینه Add Reference به dll ساخته شده از ClassLibrary رفرنس بدین. (نیازی به استفاده از دستور using نیست، دستور using رو استفاده می کنین که هربار نیازی به تکرار فضای نام نداشته باشین).

حالا برای اینکه دسترسی مستقیم به متغیرهای تعریف شده داشته باشین شما باید متغیرها رو از نوع static تعریف کنین، در غیر اینصورت ابتدا باید از کلاس موجود در ClassLibrary نمونه گرفته و سپس به متغیر ها دسترسی داشته باشین.

البته مباحث در این مورد زیاده و برای اینکه اینارو بهتر درک کنید به رفرنس های microsoft مراجعه کنید.

موفق باشین.

maryshayegh
چهارشنبه 13 بهمن 1389, 19:11 عصر
وقتی شما کتابخانه ای داشته باشید (dll.*) و با استفاده از using آن را به پروژه خود اضافه می کنید انگار کلاس موجود در کتابخانه را به پروژه خود اضافه می کنید. حالا اگر کلاس توی کتابخانه پابلیک باشه برای اینکه به آن دسترسی داشته باشید باید از آن شی درست کنید. البته بستگی به استفاده ممکنه بعضی مواقع نیاز به ارث بری داشته باشه


پاسختون قابل درک بود ، مرسی . من الان یه کتابخانه درست کردم از نوع public ، طبق گفته ی شما سعی کردم using کنم ولی اونو نشناخت ! در حالی که من رفرنسشم کردم . شی ء از کلاس هم ایجاد کردم ولی نتیجه ای نگرفتم ، نمیدونم چیکار باید میکردم که نکردم !

.................................................. ..................

حالا برای اینکه دسترسی مستقیم به متغیرهای تعریف شده داشته باشین شما باید متغیرها رو از نوع static تعریف کنین، در غیر اینصورت ابتدا باید از کلاس موجود در ClassLibrary نمونه گرفته و سپس به متغیر ها دسترسی داشته باشین.

درمورد سطوح دسترسی توضیحتون خیلی کامل بود و فهمیدمش ، مرسی . راستش من متغیر ها رو static هم تعریف کردم ولی یه جایی دارم خطا میرم که به جواب نمیرسم ! منظورتون از نمونه همون تعریف شی ءه دیگه ؟

ACorvinus
چهارشنبه 13 بهمن 1389, 19:41 عصر
سلام دوباره.


منظورتون از نمونه همون تعریف شی ءه دیگه ؟

آره منظورم همون Instance گرفتن هستش. برای مثال اگه یه کلاس XClass دارین که در فضای نام Elements قرار داره و میخواین به عنصری از آن به نام Age که از نوع public هست که مقدار آن 22 می باشد دسترسی داشته باشین باید بدین صورت عمل کنین:


Elements.XClass XCInstance = new Elements.XClass();
int _Age;

_Age = XCInstance.Age;

خب حالا اگه عنصر Age شما public static تعریف شده باشه، اینجوری بهش دسترسی خواهید داشت:


int _Age = Elements.XClass.Age;

استفاده از ClassLibrary خیلی راحته، نمیدونم چرا این همه سخت گرفتین واس خودتون. مشکلی بود ما در خدمتیم مهندس. موفق باشین.

maryshayegh
چهارشنبه 13 بهمن 1389, 19:50 عصر
استفاده از ClassLibrary خیلی راحته، نمیدونم چرا این همه سخت گرفتین واس خودتون. مشکلی بود ما در خدمتیم مهندس. موفق باشین.
ماشالله چه در دسترسین ؛ بازم ممنونم ، اگه من مهندس بودم که این سوالم نبود که مهندس :لبخندساده:
از بی تجربگیه ولی خب خداییش هی میرم امتحان میکنم تا جواب بگیرم ، ممنون از راهنماییهاتون
موفق باشین

maryshayegh
چهارشنبه 13 بهمن 1389, 20:11 عصر
نمیدونم دیگه حوصله دارین بازم جواب ســــــــــــــــوالهای منو بدین یا ...:اشتباه:
اگه جواب بدین ممنون میشم ؛ هر چی میرم جلوتر مشکلاتمو بیشتر میفهمم !
سوالم اینه ؛ در کد زیر

namespace Inheritance
{
class Program : MyClass
{
static void Main(string[] args)
{
Program obj = new Program();
// MyClass obj = new MyClass();
obj.SumPrint();
Console.ReadKey();
}
}

class MyClass
{
private int i;
protected int j;

protected int SumPrint()
{
i = Convert.ToInt32(Console.ReadLine());
j = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("The Sum of i and j is {0}", i + j);
Console.ReadKey();
return i + j;
}
چرا شی obj از کلاس Program تعریف شده ؟ نکنه بخاطر اینه که Program از MyClass ارث بری میکنه ؟! اگه اینطوره پس چرا وقتی اسم Program رو برمیدارم و به جاش MyClass رو میذارم ارور میده ؟
و اینکه همیشه برای استفاده از متدها و متغیر های یه کلاس که ازش ارث بری میکنیم ، باید شی تعریف بشه ؟

ACorvinus
چهارشنبه 13 بهمن 1389, 20:38 عصر
چرا شی obj از کلاس Program تعریف شده ؟

چون Program یک Object هست و برای دسترسی به اعضای MyClass باید از Program نمونه گرفته و به اونا دسترسی داشته باشین.


نکنه بخاطر اینه که Program از MyClass ارث بری میکنه ؟

آره، حدست درست بوده.


اگه اینطوره پس چرا وقتی اسم Program رو برمیدارم و به جاش MyClass رو میذارم ارور میده ؟


چوننوع دسترسی j و SumPrint از نوع protect هستن. اگه مستقیما از کلاس MyClass نمونه بگیرین نمیتونین این عناصر رو ببینین.


و اینکه همیشه برای استفاده از متدها و متغیر های یه کلاس که ازش ارث بری میکنیم ، باید شی تعریف بشه ؟

اگه کلاس x از کلاس y ارث بری کرده باشه و بخوایم از داخل کلاس x به متغیرهای کلاس y دسترسی داشته باشیم باید از خود کلاس x نمونه بگیریم مگر اینکه متد موجود در کلاس y از نوع static تعریف شده باشد که در اینصورت نام کلاس x را نوشته و با زدن "دات --> . <--" به متدها یا متغیرهای static کلاس y دسترسی مستقیم پیدا می کنیم.

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

georgiaro
پنج شنبه 14 بهمن 1389, 01:34 صبح
با تایید مطالب بالا این هم یک مثال ساده برای مشخص شدن چگونگی دسترسی.(دسترسی های معتبر)


class y
{
protected int a;
static public int b;
}
class x : y
{
public void f1()
{
a = 10;
b = 6;
}
static void f2()
{
b = 8;
x obj = new x();
obj.a = 4;
}
}