PDA

View Full Version : معادل پراپرتیهای دلفی در C++



Sepidar
چهارشنبه 09 فروردین 1385, 14:42 عصر
کسی میدونه معادل مفهوم property ها در C++وجود داره یا نه؟ و اگه وجود داره چیه؟

اَرژنگ
جمعه 11 فروردین 1385, 03:19 صبح
جواب ساده به این سوال خیر است، منتها جواب کاملتر اینه که میشه این کار را در سی++ تقلید کرد.
این لینک یکمی بیشتر در این مورد توضیح میده.
http://www.codeguru.com/Cpp/Cpp/cpp_mfc/article.php/c4031/

Sepidar
جمعه 11 فروردین 1385, 13:56 عصر
مزیت مهم پراپرتیهای دلفی به غیر از کپسوله سازی، سرعت عالی و صرفه جویی در کدنویسیشونه. این راه حلی که شما پیشنهاد کردی، حداقلش اینه که اون سرعت رو نداره.

اَرژنگ
جمعه 11 فروردین 1385, 14:19 عصر
مزیت مهم پراپرتیهای دلفی به غیر از کپسوله سازی، سرعت عالی و صرفه جویی در کدنویسیشونه. این راه حلی که شما پیشنهاد کردی، حداقلش اینه که اون سرعت رو نداره.
منم میدونم اینو ، ولی شما در مورد سرعت و مشکل اصلی چیزی نگفتید، اگر بیشتر توضیح میدادید مشکل چی هست، یک راهه دیگه پیشنهاد میردم.
منتها پروپرتیهایه دلفی به توسط بورلند پاتنت شدند، و بخاطر همین در زبانهایه دیگر پیدا نمیشند.
من راهی پیشنهاد نکردم، ولی اگر قرار باشه راهی پیشنهاد کنم، اوّل میپرسم چرا سی++، و مشکلی که میخواهید حل کنید چی هست.
اگر حال و حوصله با پوینتر کارکردن را دارید، میتونید از پوینتر به تابع استفاده کنید که کپی همانطوریه که دلفی کار میکنه.
ولی هر زبانی خصوصیت خودش را داره، در سی مثل دلفی کار کردن از دلفی کار کردن با دلفی سختره.

Inprise
جمعه 11 فروردین 1385, 17:28 عصر
نمیدونم منظورت از سرعت دقیقا چیه و با چه دیمانسیونی . اما پراپرتی ها متعلق به وی سی ال هستند نه دلفی بنابراین روی بورلند سی هم بهشون دسترسی خواهی داشت . ام اف سی و دات نت هم مکانیزمهای مشابهی دارند . مفهوم پراپرتی چیزی نیست که متعلق به بورلند باشه یا پتنت ای براش وجود داشته باشه ؛ فقط جزو اجزاء اساسی سی ( ANSI/ISO CPP-2003 ( نیست چون در استاندارد سی تعریف نشده ، چون پراپرتی برای Component-Based Development مفید هست و استاندارد سی تضمینی برای مبدل کردن Object Oriented CPP به یک بستر Component-based ارائه نمیکنه .

Sepidar
جمعه 11 فروردین 1385, 18:56 عصر
عرض شود که پراپرتیها دقیقا مفهومی که نیستند که مخصوص وی سی ال طراحی شده باشند.
اون چیزی که اطلاعات لازم رو در دسترس RTTI قرار میده تا Object Inspector یه عضو رو نشون بده، published بودن یه عضو کلاسه.

پراپرتی در واقع مفهومیه که دسترسی به قسمتهای داخلی کلاس رو با حفظ امنیت، برای کاربر ساده و سهل الوصول میکنه.

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

THuman=class
private
fLength:real;

protected
procedure SetLength(alength:real);

public
property Length:real read fLength write SetLength;
end;
حالا شما هر جا که از متغیر غیر واقعی Length استفاده کنید، کامپالر باهاش برخورد مناسب رو میکنه. مثلا کامپایلر این کد رو

Mehdi.Length:=210;
Omid.Length:=Mehdi.Length/2; اینجوری میبینه و کامپایل میکنه:

Mehdi.SetLength(210);
Omid.SetLength(Mehdi.fLength/2);
این روش چند تا مزیت داره:
فانکشن SetLength تضمین میکنه که مثلا عدد منفی تو اون فیلد نوشته نمیشه.
از نوشتن یه فانکشن اضافی مثل GetLength برای دسترسی به fLength خلاص شدیم.
اگه برای خوندن مقدار fLength مجبور بودیم از GetLength استفاده کنیم، عملا با کاهش سرعت مواجه میشدیم. (فرض کن این دسترسی تو یه حلقه باشه.)
کد خواناتره و برای استفاده کننده از کلاس خوشدستتره.

seyedof
جمعه 11 فروردین 1385, 20:55 عصر
عرض شود که پراپرتیها دقیقا مفهومی که نیستند که مخصوص وی سی ال طراحی شده باشند.
اون چیزی که اطلاعات لازم رو در دسترس RTTI قرار میده تا Object Inspector یه عضو رو نشون بده، published بودن یه عضو کلاسه.

پراپرتی در واقع مفهومیه که دسترسی به قسمتهای داخلی کلاس رو با حفظ امنیت، برای کاربر ساده و سهل الوصول میکنه.
کد خواناتره و برای استفاده کننده از کلاس خوشدستتره.[/LIST]

سلام
آقا من نمفهمیدم که اصلا منظور شما از پراپرتی چیه تا اینکه مستر اینپرایز گفتن. و ایشون درست میگن. مفهموم Property کلا یه چیز Borland Specific است حالا ممکنه مختص VCL نباشه ولیکن روش خاص بورلند است. در ویژوال سی همچین چیزی به این شکل وجود نداره. اما شما که دلفی رو مسلط هستید برای شروع به نظرم اگر Builder کار کنید خیلی بهتره چون عین دلفی میمونه و همین مفاهیم VCL و Property و غیره رو کاملا داره فقط زبانش c++ است.
ولیکن چون این مفاهیم مختص بورلنده توصیه میشه که ازشون استفاده نکنید مگر در مواردی خاص مانند کمپوننت نویسی.
بهترین کار نوشتن کلاسها به صورت ANSI است تا توی همه کمپایلرهای سی کار کنه.
ممنون علی

Inprise
جمعه 11 فروردین 1385, 23:26 عصر
@ سپیدار : مرسی بخاطر کلاس آموزشی و تدریس مفهوم پراپرتی . بعد از سالها خاطرات نوجوانی زنده شد . اگر به نکته که ذکر شد دقت کنی پراپرتی های وی سی ال در تعریف استاندارد سی وجود ندارند اما کتابخانه های مختلف به روشهای متفاوت چیزی مشابه همین قابلیت رو ارائه میکنند . ام اف سی قابلیت RTTI رو به این شکل نداره اما دات نت که به صورت مبسوطی از مدل وی سی ال تقلید کرده این امکان رو حتی کاملتر داره . در هر حال "سی" به معنای استانداردش دارای چنین امکانی نیست ، اما در عمل این روزها الا در شرایط خاصی ، کسی با "سی" برنامه نمینویسه ، بلکه با ویژوال سی/ام اف سی یا بورلند سی بیلدر یا سی/کیوتی و ...برنامه نوشته میشه که هر کدام از کتابخانه های مذکور چون برای افزایش قابلیت توسعه به کامپوننت متکی هستند امکاناتی نسبتا" مشابه رو دارن .




@ سیداف : حالا مایکروسافت هم از قابلیت جالب پراپرتی استفاده میکنه . پراپرتی در تالیف استاندارد CPP/CLI در نظر گرفته شده و همان نقشی که سالها در وی سی ال ایفا میکرد حالا در دات نت ارائه میکنه . پس دیگه مختص بورلند نیست .
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmex/html/vclrf__property.asp

Sepidar
جمعه 11 فروردین 1385, 23:49 عصر
اینپرایز عزیز، اون کلاس آموزشی واسه این بود که سوالم واسه ملت گنگ نمونه؛ باقیش رو هم نمی نویسم تا به حساب [پاچه خواری] گذاشته نشه!

فعلا جواب سؤال دریافت شد؛ تا بعد ببینیم چی پیش میاد.

Delphi Skyline
شنبه 12 فروردین 1385, 00:06 صبح
اینم یه مثال ساده از صحبت های جناب اینپرایز ::


__property AnsiString Name = {read=FName, write=SetName, stored=false};