PDA

نسخه کامل مشاهده نسخه کامل : کج فهمی در مسائل شی گرایی



Life24
23-04-2013, 12:52
سلام

من 2 مورد رو اساسی نمیفهمم.
تو یک مثال ماکروسافت این موارد رو داریم.



TcpListener = server = new TcpListener(port);

TcpClient client = server.acceptTcpClient();

NetworkStream stream = client.GetStrream();




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

TcpListener = server = new TcpListener(port);


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

TcpClient client
NetworkStream stream

\

در مورد شی میدانم برای کار بر روی یک کلاس و مدیریت توابع و متغیر ها و استفاده از اون یک شی از اون کلاس با new ایجد میکنیم که حاوی سازنده و .. هم میشه. و حافظه میگیریم.
اما اون دو مورد چی؟


ههه موارد بالا در سمت سرور هست.
حالا در سمت Client
ما دیگه متغیر از نوع کلاس نداریم. امدیم شی رو ایجاد کردیم!
TcpClient client = new TcpClient(server,port)
در صورتی که در سرور فقط متغیر از نوع تغیر کردیم و شی ایجاد نکردیم.

_H2_
23-04-2013, 17:13
سلام
سوال تان از این بابت خوب است که نشان میدهد میخواهید بفهمید و این خیلی دلگرم کننده است.

برای آنکه بتوانید با یک کلاس کار کنید، در هر صورت باید یکجایی new شود.
مورد اول که واضح است و خودتان آن را new کرده اید، پس می ماند دو شکل بعدی نمونه سازی...

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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این کلاس را با همچین کدی میتوان new کرد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا من میخواهم یک تابعی بنویسم که بتواند دو کسر را جمع کند، چه باید انجام دهم؟ چطور بنویسم؟ بگانم این کد مناسبی است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب چطور باید استفاده کرد؟ طبیعتاً با کدی شبیه این:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب حالا اجازه دهید من بپرسم!
چرا x و y در کد بالا new شده اند ولی z چرا new نشده؟
new شدن z کجاست؟
چطور بفهمیم نیازی نبوده z را صراحتاً و دستی new کنیم؟


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

خیلی طبیعی است که ورودی و خروجی توابع بتوانند کلاس باشند و طبیعتاً اگر خروجی یک تابع ، از نوع class (و چه struct) باشد، ما دیگر نیازی به new کردن نداریم، چون تابع دارد موجودیتی به ما پس میدهد، موجودیتی که هویتی در RAM دارد و حتماً قبلاً new شده و مقدار دهی شده که حالا تابع میتواند نتیجه کارش را در آن قالب به ما پس دهد.

نمیدانم چقدر توانستم به خواسته شما نزدیک شوم.
امیدوارم به چیزیکه میخواهید رسیده باشید؟!
موفق باشید.