اون دیگه سی نمیشه آخه. منظور پیاده سازی در سطح داخلی و سینتاکس زبان سی هست. وگرنه اگر کلا بخواید با یه سینتاکس با امکان شیء گرایی کامل کد بنویسید میشه هممون سی++. حالا چه برای کامپایل به سی تبدیل بشه و چه کامپایلر مجزا داشته باشه. بهرحال دیگه نمیشه بهش گفت سی! اگر بخوان چنین سیستمی درست کنن کار بی فایده ای هست چون سی++ تمام این ویژگیها رو آماده داره. سی و سی++ هرکدوم جدا هستن و مجهز کردن سی بصورتی که هنوز سی باشه اما امکان شیء گرایی رو هم داشته باشه در همون حد هست که میبینید (و امکاناتش به پای زبانهایی مثل سی++ نمیرسه). وگرنه اگر بخوان روی سی کار دیگه بکنن که با وجود سی++ ضرورتی هم نداره، چیزی که حاصل میشه رو دیگه نمیشه سی نامید. سینتاکس خود سی چنین ظرفیتی رو نداره.
مزیت برای برنامه نویسی اپلیکیشن همین آماده بودن هرچه بیشتر امکانات عمومی هست در سطح برنامه نویسی اپلیکیشن. هر کتابخانه و فریمورکی که کاملتر باشه مسلما برای اپلیکیشن نویسها مناسبتر بحساب میاد.نقل قول:
در سیشارپ و زبانهای تحت داتنت هم اینطور است، اگر فلان کلاس برای فلان کار وجود نداشته باشه
بهرحال اسمش هرچی باشه، یه زبانی که ارث بری و امکان پکیج کردن کامل توابع و دیتا رو با هم نداشته باشه بنظرم ضعیف تر از زبانی که همهء این امکانات مهم رو داشته باشه بحساب میاد در زمینهء شیء گرا بودن.نقل قول:
چیزی به نام شیئگرائی کامل نداریم. در واقع هر زبانی با توجه به طرز تفکر خودش، شیئگرائی را تعریف و پیادهسازی کرده...
من نمیدونم اون زمان در مقالهء ویکیپدیا اینطور نوشته بود:نقل قول:
متاسفانه باید بگویم اصلا اینطور نیست. یا آن مقالهٔ موجود در ویکیپدیا اشتباه نوشته یا شما با عجله به این نتیجه رسیدهاید. برای ارثبری از یک ویدجت یا کلاس در Gtk نیازی به کامپایل مجدد یا نیازی به کپی/پیست سورسکدهای کلاس والد (پدر یا base) نیست. تنها چیزی که تکراری است و باید کپی/پیست شود، ۵ عدد ماکروی ناچیز هستند که برنامهنویس آنها را تعریف میکند:
#define EAZ_TYPE_TIMELINE (eaz_timeline_get_type ())این ماکروها تمام چیزهایی است که کاربر باید کپی/پیست کند، کدهای بالا را من از برنامهای که در حال نوشتن آن هستم آوردهام که مربوط به ویدجت Timeline است که برای نمایش گرافیکی وضعیت فعلی زمان به کار میرود. Eaz هم در اینجا نام فضای نام است. بگذریم اگر برنامهنویس ماکروهای بالا را هم تعریف نکند، آسمان به زمین نمیآید. :شیطان:
#define EAZ_TIMELINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EAZ_TYPE_TIMELINE, EazTimeline))
#define EAZ_TIMELINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EAZ_TYPE_TIMELINE, EazTimelineClass))
#define EAZ_IS_TIMELINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EAZ_TYPE_TIMELINE))
#define EAZ_IS_TIMELINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EAZ_TYPE_TIMELINE))
#define EAZ_TIMELINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EAZ_TYPE_TIMELINE, EazTimelineClass))
Gobject که اساس Gtk را تشکیل میدهید، از ارثبری یگانه + ارثبری چندین اینترفیس (Interface) و توابع virtual و همچنین از signal و slotها پشتبانی میکند و جالب اینکه حتی مدیریت حافظه (memory management) را هم بر عهده خواهد گرفت.
For example, creating a non-trivial subclass (even just a subclass of GObject) can require writing and/or copying hundreds of lines of code. Nevertheless, adopting GObject can lead to a significant improvement of C code that is, or wants to be, object-oriented.
منبع: http://en.wikipedia.org/wiki/GObject
این متن هنوزم هست. بنابراین من فکر میکنم هنوزم مصداق داره وگرنه مقاله های ویکیپیدا اونم درمورد اینطور چیزها سریع آپدیت میشن.
ضمنا دقت کنید گفته میتونه اینطور باشه، نه اینکه همیشه اینطوره.
اینا رو که میدونم عزیز برادر. بحث پیاده سازی داخلی نیست. وگرنه همهء زبانها نهایتا به اسمبلی و کد ماشین تبدیل میشن که شیء گرایی حالیش نمیشه!نقل قول:
در رابطه با اینکه در زبان C توابع درون struct قرار نمیگیرند، باید بگویم که این تناقضی با شیگرائی ندارد. اگر واقعیت را بخواهید بدانید، توابع عضو کلاس در ++C در واقع همان توابع معمولی هستند که آرگومان اول آنها از نوع خود کلاس است (this) و در زبان C با اینکه توابع خارج از ساختار قرار گرفتهاند اما آنها نیز آرگومان اولشان از نوع structای است که به آن مربوط هستند. در واقع اینطور بگویم، شیئگرایی به ظاهر نیست، به مفهوم و کاربرد آن است.
مهم اینه که این جزییات در سطح برنامه نویس با انتزاع و راحتی مناسب پیاده شده باشن و بتونن در خوانایی و تجسم صحیح برنامه نویس در نوشتن برنامه های سطح بالا بکار برن.
منم به این اشاره کردم که میشه و ترفند و ابزار و روش داره.نقل قول:
مقایسهای که من در چند پست قبل نوشته بودم، حتیالمقدور فاقد مسائل فنی بود و فقط برای بیانکردن شرایط خاص هر زبان نوشته بودم. برای انجام مقایسه فنی که بحث بسیار است :شیطان: اما به طور کلی، چه کسی گفته وجود memory management در همه حال خوب است؟ آیا اصلا در همه حال به آن احتیاج است؟ (اینطور به شما بگویم، در ++C (نه در C) میتوانید طوری برنامه بنویسید که نیازی به آن نباشد!).
اما همهء اینا قابل مقایسه با زبانی که این کارها رو خودش بصورت خودکار انجام میده و نیاز به هیچ یادگیری و دقتی در این زمینه نداره نیست.
من صرفا واقعیت ها رو میگم. دلیل پیدایش زبانهای سطح بالا فکر میکنید چیه؟ دلیل پیدایش مدیریت خودکار حافظه چیه؟ دلیل ایجاد داینامیک تایپ چیه؟ آیا مثلا در برنامه نویسی وب کسی انتظار داره با سی++ برنامه بنویسه و حافظه رو خودش مدیریت کنه؟ چقدر اینکار معمول هست؟نقل قول:
آنطور از ++C صحبت میکنید که انگار برای شما یک جهنم بوده است!
در زبان ++C تا وقتی همهٔ زیر و بمها و روشهای برنامهنویسی در آن را به خوبی یاد نگیرید (بطور اصولی و میتوانم بگویم در حد تسلط نه فقط در حد یادگیری)، همیشه در کلنجار و عذاب خواهید بود و احساس میکنید برنامهنویسی در آن طاقتفرسا است.
بنابراین مناسب بودن یک زبان به کاربرد و نوع برنامه نویسی برمیگرده.
من جایی نگفتم سی++ بد و جهنم و ضعیف هست و نمیشه باهاش اپلیکیشن های خوبی نوشت. بلکه میگم سی شارپ و دات نت ایدهء خوب و مفیدی هست و Productivity رو در برنامه های اپلیکیشن عادی میتونه به مقدار قابل توجهی بالا ببره. بنابراین وقتی سی شارپ و دات نت هست دیگه سی++ در اون موارد انتخاب بهتری بحساب نمیاد. اما هنوزم سی++ کاربردهای خودش رو داره و شاید ضرورت چندانی نداشته باشه برنامه نویسان حرفه ای سی++ به سی شارپ مهاجرت کنن، اما کسی که از ابتدا میخواد شروع کنه یک زبان برای اپلیکیشن نویسی عادی تحت ویندوز رو، چرا سی شارپ بجای سی++ نه؟!
بله میدونم.نقل قول:
طراحان زبان ++C میتوانستند همهٔ خصائص را در خود زبان جا دهند. دسترسی به اعضای آرایهها را تا اندازهشان محدود کنند. طول آرایه را به همراه خود آرایه ذخیره کنند. رشتهها را به عنوان یک نوع جدید معرفی کنند و ... اما این کار انجام نشد و نخواهد شد: چون: ۱) سازگاری با C و ۲) مناسب برای برنامهنویسی سیستمی ۳) کم حجم بودن و افزایش کارآیی زبان ۴) در ازایش کافی بود قابلیت مورد نظر را به عنوان یک کلاس یا تابع در کتابخانهٔ استاندارد (Standard Loibrary) قرار دهند.
به همین دلیل وقتش رسید که زبانهای پیشرفته از سی++ برای اهداف سطح بالاتر هم بیان و وظیفهء این یادگیری و دقت و کدنویسی های اضافه گردن برنامه نویس اپلیکیشنهای عادی نباشه.
درواقع زبانهایی مثل سی شارپ و سی++ مکمل هستن. البته در موارد زیادی با هم درمورد کاربرد همپوشانی و تضاد پیدا میکنن ولی بطور کلی هرکدوم بخشی رو پوشش میدن و مزایا و معایبی دارن که در کاربردهای مختلف اهمیت اونها تفاوت میکنه؛ بنابراین اینطور نیست که بگیم یکی بهتر از دیگری هست. بستگی به کاربرد و شرایط داره. من میگم برای اپلیکیشن نویسی عادی روی ویندوز سی شارپ مگه چه اشکالی داره و چرا باید سی++ رو بهش ترجیح داد؟ تازه آینده سی شارپ در اثر سیاست های مایکروسافت روشنتر از سی++ بنظر میاد. سازگاری با استانداردهای جدید و تعداد زیاد برنامه نویسان و کدها و کتابخانه ها و پشتیبانی بروز و کامل و قوی هم مسلما میتونن یک مزیت دیگر در آینده برای سی شارپ باشن.