PDA

View Full Version : سوال: تفاوت بین کلاس object و نوع object با طرح یک مثال



babak1
شنبه 09 بهمن 1389, 18:39 عصر
سلام :
تفاوت بین کلاس object و نوع object چیست ؟
مثال زیر رو در نظر بگیرید :


int [] test = new int[20];
listbox1.items.AddRange(dirveInfo.GetDrive());


در این مثال اگر ما آرایه test رو به عنوان مقدار به listbox اختصاص با خطا مواجه میشیم. چون نیاز به آرایه ای از نوع object دارد. ولی وقتی DriveInfo.Getdrive() رو اختصاص می دیم مشکلی پیش نمی یاد. چون خروجی dirveInfo.Getdrive() از نوع کلاس driveInfo هستش. این کلاس هم که زیر مجموعه ای از کلاس object . (مگر نباید از نوع object باشد؟؟؟)

amir-yeketaz
شنبه 09 بهمن 1389, 20:29 عصر
ببینید ... مشخصه که شما با مسائل ارث بری و چند ریختی آشنا نیستید!!!!
همان طور که میدونین تمام کلاس ها در دات نت از کلاس Object ارث بری دارن ... در ارث بری هر شی ساخته شده در کلاس فرزند میتونه در کلاس پدر ریخته بشه ... و از این ویژگی میشه استفاده های فراوانی از جمله مثال شما برد!

این کد را در رویداد Form_load یا هر رویدادی که دوست دارین!!! به کار ببرین :


object obj;
Form objForm = new Form();
obj = objForm;
MessageBox.Show(obj.GetType().ToString());

همون طور که خواهید دید شی obj از نوع Form هستش ... خوب الان میتونید به صورت explicit این شی رو تبدیل به Form کنید و هر کاری رو که میخواین عین کلاس فرم باهاش بکنید ...

توصیه میکنم بیشتر در مورد شی گرایی در سی شارپ مطالعه کنید !!! چون بسیاری از مشکلات برمیگرده به فهم دقیق نداشتن از شی گرایی!!

موفق باشید ...

ali.rezaei7
شنبه 09 بهمن 1389, 20:45 عصر
درود. متد AddRange فقط آبجكت هاي String رو قبول مي كنه. بخاطر همين هست كه وقتي مي خواي آرايه int (يا هر نوع داده اي اوليه مثل byte,double,...) رو به عنوان پارامتر به تابع ارسال كني كامپايلر، خطا مي گيره. در مورد آبجكت هايي مانند DriveInfo يا هر آبجكت ديگه، قضيه فرق مي كنه! اگه آرايه اي از اين نوع آبجكت ها رو ارسال كني، تابع AddRange بصورت پيش فرض، مقداري كه توسط متد ToString عنصرهاي آرايه برگشت داده ميشه رو براي مقدار Item جديد در نظر مي گيره.

sds1920
شنبه 09 بهمن 1389, 21:24 عصر
من تا بحال به این مشکل برنخوردم که شما می گی.ولی احتمالا چون از اسم آرایه استفاده می کنید و
اسم آرایه آشاره گر به آرایه هست ومقداری رو شامل نمیشه،برای همین مشکل پیش اومده.ولی مطمئن نیستم.

epsi1on
یک شنبه 10 بهمن 1389, 01:24 صبح
سلام :
تفاوت بین کلاس object و نوع object چیست ؟
مثال زیر رو در نظر بگیرید :


int [] test = new int[20];
listbox1.items.AddRange(dirveInfo.GetDrive());
در این مثال اگر ما آرایه test رو به عنوان مقدار به listbox اختصاص با خطا مواجه میشیم. چون نیاز به آرایه ای از نوع object دارد. ولی وقتی DriveInfo.Getdrive() رو اختصاص می دیم مشکلی پیش نمی یاد. چون خروجی dirveInfo.Getdrive() از نوع کلاس driveInfo هستش. این کلاس هم که زیر مجموعه ای از کلاس object . (مگر نباید از نوع object باشد؟؟؟)
سلام دوست من.
منظور شما رو از خط دوم فرمایشتون متوجه نشدم، ولی همونطور که دوستان هم فرمودند در دات نت همه کلاسها از کلاس Object ارث بری دارن و به نوعی هر نمونه ای از هر کلاسی یه object به حساب میاد چون کلاسی که شی نمونش هست از کلاس Object ارث بری داره. ولی در مورد آرایه ها ظاهرا اینطور نیست. برای من هم این نکته خیلی جالب بود و تاحالا بهش بر نخورده بودم. کمی در مورد این مشکل جستجو کردم ولی متاسفانه چون آشنایی کافی با دات نت (و سی شارپ) نداشتم چیز زیادی متوجه نشدم. بحث اصلی سر این هست که شما نمیتونید مستقیما یک آرایه ای از نوع مقداری به آرایه ای از نوع ارجایی تبدیل کنید (البته بازهم عرض میکنم که برای من هم این بحث جدید بود و چون با یسری چیزها آشنایی ندارم دلیلش رو دقیق متوجه نشدم...)
این یه کلیتی از قضیه بود و خودم هم دقیقا نمیدونم جزئیات بیشترش رو از کجا میتونید متوجه بشید :) ...
در هر حال امیدوارم مفید بوده باشه...

amir-yeketaz
یک شنبه 10 بهمن 1389, 13:57 عصر
بحث اصلی سر این هست که شما نمیتونید مستقیما یک آرایه ای از نوع مقداری به آرایه ای از نوع ارجایی تبدیل کنی
من متوجه منظورتون نمیشم ! ، ولی اینو میدونم که آرایه ها ذاتا Reference Type هستن و ما آرایه ی Value Type نداریم!!!

موفق باشید ...

epsi1on
یک شنبه 10 بهمن 1389, 18:26 عصر
من متوجه منظورتون نمیشم ! ، ولی اینو میدونم که آرایه ها ذاتا Reference Type هستن و ما آرایه ی Value Type نداریم!!!

موفق باشید ...
سلام دوست من.
عذر میخوام، نتونستم منظورم رو درست برسونم. منظورم از نوع آرایه نوعی بود که آرایه رو از اون نوع معرفی میکنید (مثلا برای آرایه ای با نوع []int میشه نوع int نه نوعی که از System.Array مشتق شده.).

babak1
سه شنبه 12 بهمن 1389, 13:24 عصر
ببینید ... مشخصه که شما با مسائل ارث بری و چند ریختی آشنا نیستید!!!!
همان طور که میدونین تمام کلاس ها در دات نت از کلاس Object ارث بری دارن ... در ارث بری هر شی ساخته شده در کلاس فرزند میتونه در کلاس پدر ریخته بشه ... و از این ویژگی میشه استفاده های فراوانی از جمله مثال شما برد!

این کد را در رویداد Form_load یا هر رویدادی که دوست دارین!!! به کار ببرین :


object obj;
Form objForm = new Form();
obj = objForm;
MessageBox.Show(obj.GetType().ToString());

همون طور که خواهید دید شی obj از نوع Form هستش ... خوب الان میتونید به صورت explicit این شی رو تبدیل به Form کنید و هر کاری رو که میخواین عین کلاس فرم باهاش بکنید ...

توصیه میکنم بیشتر در مورد شی گرایی در سی شارپ مطالعه کنید !!! چون بسیاری از مشکلات برمیگرده به فهم دقیق نداشتن از شی گرایی!!

موفق باشید ...
مطالبی که بیان کردید رو من می دونستم دوست من. بذارید سوالم رو جور دیگزی بپرسم. شما وقتی کلمه object رو تایپ می کنید 2 کلمه object در VS ظاهر می شود یکی به رنگ سبز که نشان دهنده کلاس است یکی به رنگ آبی که نشان دهنده نوع (اگه اشتباه بود بگید) حالا سوال من این است که در مثال خودتان چطور objform که از کلاس form و درنهایت از "کلاس" object مشتق می شود در داخل obj که از "نوع" object است قرار می گیرد ؟؟

با تشکر.

amir-yeketaz
سه شنبه 12 بهمن 1389, 14:41 عصر
تا اونجایی که من میدونم این حالت دات نت بوده که برای یه سری از انواع داده مثه هم اومده که حالتی شبیه ValueType ها قرار داده ...(میشه کلاس String رو هم یه مثال دیگه نام برد!) ... پس هیچ تفاوتی وجود نداره و هر دو Reference Type هستن و عین همن...
البته کاملا از صحت صحبتم مطمئن نیستم و فقط به خاطره وجود داشتن مثالی مثه string اینو میگم!


موفق باشید ...

epsi1on
سه شنبه 12 بهمن 1389, 15:05 عصر
کلاس است یکی به رنگ آبی که نشان دهنده نوع
من دقیقا متوجه نشدم که از نظر شما نوع و کلاس چه تفاوتی دارن (اگر ممکنه بیشتر توضیح بدید تا اگر تونستم بیشتر راهنمایی کنم) ولی توی #C یه چیزی داریم تحت عنوان alias Naming . تا اونجایی هم که من میدونم نوعی که ما مثلا با کیورد intنشونش میدیم، نام مستعار (یا همون alias Name) نوع System.Int32 هست. (همچنین بین string و System.String و بین object و System.Object هم همچین چیزی برقرار هست).
در حین برنامه نویسی هم تفاوتی نداره که شما از نام مستعار کلاس استفاده کنید یا از نام خود کلاس...