PDA

View Full Version : سوال: سوال در مورد cast کردن object ها به یکدیگر



pro_mvb
شنبه 06 آذر 1389, 16:02 عصر
سلام
من در مورد کست کردن آبجکت ها به هم سوالی داشتم:
فرض بگیریم ما یک کلاس b داریم که دارای 4 متد هست که وظایف 4 عمل اصلی ریاضات رو انجام میدن.
حال این کلاس از کلاس پدر خود یعنی کلاس a ارث برده است.

سوال:
وقتی میگیم:


b ob=new a();

در اینجا ob به جایی اشاره میکند که a است پس چرا وقتی متد ها و پروپرتی های ob رو نگاه مکینم(یعنی

ob.ctrl+space
) به جای داشتن متدهای کلاس a ، متدهای کلاس پدر خود یعنی B را دارد؟؟

چه کاریه خوب از اول آجکت از کلاس پدر گرفته میشد.
ممنون:بوس:

pro_mvb
شنبه 06 آذر 1389, 23:18 عصر
یکی به منم جواب بده لطفا. من کلی سوال دارم :خجالت:

javaphantom
یک شنبه 07 آذر 1389, 07:47 صبح
یکی به منم جواب بده لطفا. من کلی سوال دارم :خجالت:

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

به همین راحتی. بله حرف شما درسته که متدودهای پدر رو می بینه. اما این داستان کجا بدرد می خوره ؟
در جایی که متدود های پدر بصورت abstraction باشه

javaphantom
یک شنبه 07 آذر 1389, 07:53 صبح
سلام
من در مورد کست کردن آبجکت ها به هم سوالی داشتم:
فرض بگیریم ما یک کلاس b داریم که دارای 4 متد هست که وظایف 4 عمل اصلی ریاضات رو انجام میدن.
حال این کلاس از کلاس پدر خود یعنی کلاس a ارث برده است.

سوال:
وقتی میگیم:


b ob=new a();

در اینجا ob به جایی اشاره میکند که a است پس چرا وقتی متد ها و پروپرتی های ob رو نگاه مکینم(یعنی

ob.ctrl+space
) به جای داشتن متدهای کلاس a ، متدهای کلاس پدر خود یعنی B را دارد؟؟

چه کاریه خوب از اول آجکت از کلاس پدر گرفته میشد.
ممنون:بوس:


b ob = new a()
غلطه. مگه b بچه a نسیت؟ بابا رو نمی تونی به بچه cast کنی ولی بچه رو به باباش می تونی
runtime خود JMV سر Pointer می گیره طرفش

پس


a ob = new b();

pro_mvb
یک شنبه 07 آذر 1389, 10:00 صبح
آره اشتباه کرده بودم
پدر رو هم اینطوری باید به فرزند کست کرد.:


b sub_ob=b();
a super_ob=new b();
sub_b=new (b) super_ob

pro_mvb
یک شنبه 07 آذر 1389, 10:28 صبح
جواب شما سادست با این عمل کلاس فرزند دیگر به متدود های خودش دسترسی نداره.

به همین راحتی. بله حرف شما درسته که متدودهای پدر رو می بینه. اما این داستان کجا بدرد می خوره ؟
در جایی که متدود های پدر بصورت abstraction باشه

مرسی اما....!؟
خوب درسته درواقع اینطوری داریم به متد های abstract که غیر قابل آبجکت ساختن هستن دسترسی پیدا میکنیم. اما خوب مگه کلاس فرزند از کلاس پدرش ارث نبرده؟ خوب پس مجبور متدهای abstract پدر رو در خود کلاس فرزند پیاده سازی کنه. وقتی هم که از روی فرزند یه آبجکت ساده بگیریم میشه به این متد ها دسترسی پیدا کرد دیگه!! ا پس دیگه اصلا برای چی آبجکت هارو کست کنیم؟؟؟
اینطوری هم به متد های کلاس پدر دسترسی داریم هم به متد های abstract ای که پیاده سازی شدن:متفکر:

javaphantom
یک شنبه 07 آذر 1389, 15:57 عصر
مرسی اما....!؟
خوب درسته درواقع اینطوری داریم به متد های abstract که غیر قابل آبجکت ساختن هستن دسترسی پیدا میکنیم. اما خوب مگه کلاس فرزند از کلاس پدرش ارث نبرده؟ خوب پس مجبور متدهای abstract پدر رو در خود کلاس فرزند پیاده سازی کنه. وقتی هم که از روی فرزند یه آبجکت ساده بگیریم میشه به این متد ها دسترسی پیدا کرد دیگه!! ا پس دیگه اصلا برای چی آبجکت هارو کست کنیم؟؟؟
اینطوری هم به متد های کلاس پدر دسترسی داریم هم به متد های abstract ای که پیاده سازی شدن:متفکر:


حالا اگر چند تا فرزند داشته باشیم که هر کودم به سلیقه خودشون متدودهای abstract رو پیاده سازی کرده باشن چی؟
اون موقع داستان فرق می کنه.

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

اما ما خوب می دونیم که این دوتا موجود مثل هم پرواز نمی کنند و هر کدوم متدود abstract رو به دلخواه خودشون پیاده سازی می کنند اما چیزی که برای ما مهم هست و همیشگی هست همون عمل پرواز هست پس پدر رو که نیاز مارو برآورده می کنه نگر می دارم بچهاش که هرکدوم یک جوری این نیاز رو که از پدر به ارث رسیده پیاده سازی کردن رو به پدرشون cast می کنم و خروجی یا همون حالتها ی مختلف پرواز رو بدست می یارم مثالشم برات می زارم


public abstract class FlyService {

public abstract String fly();



public static void main(String [] s) {

//FlyService is an abstract class so we can't make an instance of it
// but we can cast its children

FlyService airplane = new Airplane();

FlyService butterfly = new Butterfly();

System.out.println("airplane.fly() = " + airplane.fly());

System.out.println("butterfly.fly() = " + butterfly.fly());

}
}



public class Butterfly extends FlyService {
@Override
public String fly() {
return "Butterfly fly style";
}
}


public class Airplane extends FlyService {
@Override
public String fly() {
return "Airplane fly style";
}
}



حالا برای اینکه این

pro_mvb
یک شنبه 07 آذر 1389, 18:16 عصر
خوب اونجا override کردیم درست .
بعدش چه کاریه که بیایم آجکت رو اونطوری کست کنیم .
به جای اینکه بگیم:


FlyService airplane = new Airplane();

FlyService butterfly = new Butterfly();

از خود کلاس های بچه ها آبجکت مستقیم میسازیم. یعنی :

;
Airplane air_ob=new Airpalne();
air_ob.fly();


جواب فرقی نمیکنه میاد دقیقا همون متد fly که override کردیمو اجرا میکنه!
بدون نیاز به کست کردن آبجکت.:متفکر:

pro_mvb
یک شنبه 07 آذر 1389, 21:53 عصر
اینجا بدی که داره اینه که تاپیک های دارای پست جدید رو در بالای سایت نشون نمیده کسی نمیفهمه کی سوال داره!
آقای فانتوم هلپ

javaphantom
یک شنبه 07 آذر 1389, 22:36 عصر
خوب اونجا override کردیم درست .
بعدش چه کاریه که بیایم آجکت رو اونطوری کست کنیم .
به جای اینکه بگیم:


FlyService airplane = new Airplane();

FlyService butterfly = new Butterfly();

از خود کلاس های بچه ها آبجکت مستقیم میسازیم. یعنی :

;
Airplane air_ob=new Airpalne();
air_ob.fly();


جواب فرقی نمیکنه میاد دقیقا همون متد fly که override کردیمو اجرا میکنه!
بدون نیاز به کست کردن آبجکت.:متفکر:

با مستقیم instance گرفتن فقط خودتو محدود می کنی. وجود abstract نعمتی هست که باعث می شه شما همیشه بتونی وسعت دیدتو بالا ببری و خودتو به یک پیاده سازی خاصی محدود نکنی.

ببین این همه panel ضبط ماشین وجود داره که همه بلدن که کلیدهای روی اون چه چوری کار می کنه یا حداقل یک سری کلید دارای نماد استاندارد هستند مثل شروع یا پایان یا اینکه برو جلو یا اینکه برو عقب ولی چیزی که برای همگان مشخص نیست پشت ماجراست یعنی اون همه سیم پیج و ترانزیستور و مدار منطقی که دارن کار می کنن و هر کدوم شرکت خاصی مثل sony یا KENWOOD و هزاران شرکت دیگه پیاده سازی کردن. مهم انیکه شما به راحتی و با بی توجهی به نامهای گفته شده داری موزیکتو گوش می دی.

ولی هنگام طراحی و تولید اون موقع اهمیت این امر رو می فهمی مثل همین داستان قبلی و مثالی که من برای تو زدم. چون برای من مهم پرواز کردن هست چه جوریش مهم نیست مثل شنیدن موزیک ولی مهم نیست با چه نوع مدار منطقی صدا در بیاد. اون موقع در هنگام طراحی متوجه می شی که تغییرات چقدر سخته و به این راحتی نیست که توی کدت بیایی و هزار جا کلاس تغییر بدی مهم اینکه اصل رو داری و به اون ارجاعش می دی

pro_mvb
یک شنبه 07 آذر 1389, 23:17 عصر
آهان . مرسی
راستیتش من دارم این مفاهیم رو کار میکنم که درست و حسابی جاوا رو یاد بگیرم. جفت این کار ها داره به یه جواب میرسه درسته! من ترسم از اینه که از کجا باید میفهمیدم از اون روش کست کردن باید استفاده میکردم.؟؟ پس فردا میان میگن برنامه بنویس . از کجا باید تشخیص بدم که باید اینطوری که شما گفتی عمل کنم!

javaphantom
دوشنبه 08 آذر 1389, 07:39 صبح
اول از همه اگر شما خوب مفاهیم Object Oriented رو یاد بگیرید و متوجه بشین 90% کار رو رفتین. ربطی به جاوا یا زبان خاصی نداره این مسائل.

گام دوم اینه که شما برید سراغ design pattern اگز می خواهید یک DEVELOPER معمولی به حساب بیایید باید design pattern بدونید.

تمام این مسائل رو گفتم در مرحله آخر بر می گرده به قدرت یادگیری و کسب تجربه در یک تیم درست و حسابی که تو ایران دیگه پیدا نمی شه. اونجاست تمام این تئوریها به عمل تبدیل می شه و شما هم یکی از اونها خواهی بود

pro_mvb
دوشنبه 08 آذر 1389, 17:48 عصر
خیلی ممنون از تمام پست هایی که به من دادین . اینجا محیط مجازیه نمیدونم دیگه چطوری ازتون تشکر کنم! فقط یه چیزی اینجا خودتون میبینین که جز شما کسی به سوالات پاسخ درستی نمیده! زیاد سر بزنین. من یه دنیا سوال دارم;)