بایگانی دسته: آموزش

C# 2

آموزش برنامه نویسی #C – حلقه های foreach

در استفاده روزمره از حلقه for در برنامه ها ، کمتر از این حلقه به نحوی که شرح داده شد استفاده می شود. به علت نحوه کارکردی که چارچوپ NET. دارد،معمولا در برنامه ها با نع خاصی از این حلقه که foreach نامیده می شود بیشتر کار خواهیم کرد .
در الگوریتم برنامه ها عموما هنگامی از یک حلقه استفاده می کنید که مجموعه ای از اشیا را در اختیار داشته باشید و بخواهید بین اعضای آن جابه جا شوید، که این مجموعه هم اغلب به صورت یک آرایه است. برای مثال ممکن است بخواهید بین تمام فایل های درون یک فولدر بگردید وفایلی را پیدا کنید که اندازه آن بیش از حد مجاز است . هنگامی که از چارچوب NET. بخواهید که لیست تمام فایلها را به شما برگرداند ، یک آرایه از اشیاء را دریافت خواهید کرد که هرکدام از اعضای آن نشان دهنده ی یک فایل است . در ادامه حلقه داخل برنامه خود را به نحوی تغییر خواهید داد که نام تمام فولدرهای داخل درایو C شما را برگرداند .

حلقه foreach
۱) کنترل Button جدیدی به برنامه اضافه کنید ، خاصیت Name آن را برابر btnForEachLoop و خاصیت Text آن را برابر ForEach Loop قرار دهید .
۲) روی این کنترل دو بار کلیک کنید و کد زیر را در متد مربوط به رویداد Click آن وارد کنید :

۳) برنامه را اجرا کنید و روی دکمه ForEach Loop کلیک کنید . در ListBox نام تمام فولدرهای موجود در درایو C خود را مشاهده خواهید کرد .

چگونه کار می کند

برای به دست آوردن لیست تمام دایرکتوری های موجود در یک مسیر خاص در برنامه باید از تابع GetFirectories مربوط به کلاس Directory در فضای نام System.IO استفاده کنیم. این تابع یک آرایه رشته ای از نام تمام دایرکتوری های موجود در مسیری که برای آن مشخص شده است را برمی گرداند . در این برنامه از این تابع برای دریافت تمامی دایرکتوری های موجود در درایو C استفاده کردیم .
اصل کار حلقه foreach به این صورت است که به وسیله ی آن شما می توانید در بین تمام اشیای موجود در یک آرایه خاص که تعداد آن را نیز نمی دانید حرکت کنید برای ایجاد این حلقه به منبعی از اشیا نیاز دارید ویک متغییر کنترل کننده که در هر مرحله ، شی مورد بررسی در آن قرار خواهد گرفت. در این مثال تابع GetDirectories, ارایه ای از اشیا را به عنوان منبع برای حلقه foreach فراهم می کند و متغیر strFolder به عنوان متغییر کنترل کننده به کار می رود

PHP

آموزش برنامه نویسی PHP – ساخت یک پروژه تجاری (بخش ۵)

استفاده از تابع Insert (افزودن)

برای این کار ما نیاز به فایل های PHP دیگری داریم.
اولین کاری که بایدا انجام دهیم، ساخت یک پوشه به نام Admin می باشد.
چون افزودن، حذف و ویرایش مربوط به Admin سایت می باشد نام پوشه را Admin می گذاریم.
بعد از ساخت پوشه Admin در Root پروژه، دو فایل زیر را به آن اضافه کنید:

  1. User.php
  2. InsertUser.php

فایل User.php

ما می خواهیم در این فایل به مقدار Property های User.inc یا همان کلاس کاربر، تکست باکس (input) اضافه کنیم و با استفاده از مقادیر تکست باکس ها در جدول کاربر عمل افزودن را انجام دهیم.
کد زیر را در User.php بنویسید تا درباره آن صحبت کنیم:

در این کد ما ۶ تکست باکس نوشتیم و به آنها name و id دادیم که در فایل InsertUser.php از آنها اطلاعات را بگیریم.
همان طوری که می دانید با استفاده از خاصیت name این کار را می کنیم.

فایل InsertUser.php

در این فایل عمل اقزودن را انجام می دهیم.
به کد زیر دقت کتید:

در  این کد ابتدا دو کلاس DataAccess.inc و User.inc را Require کردیم تا از آنها استفاده کنیم.
سپس شیء از کلاس User تعریف کردیم تا از توابع آن استفاده نماییم.
و در آخر پیامی مبنی بر افزوده شدن اطلاعات اضافه نمودیم.

مقدمات جلسه بعد :

در جلسه بعد فایلی به نام Users.php در پوشه Admin اضافه می کنیم و با استفاده از تابعی که در جلسه آینده می نویسیم، تمام جدول Users را با استفاده از PHP و SQL نمایش می دهیم.

فایلی به نام Users.php در قسمت Admin بسازید و کد زیر را در آن بنویسید:

دکمه ای برای افزودن کاربر که به فایل User.php می رود.
جدولی که رکورد ها در آن نمایش داده می شوند.
همچنین شما می توانید برای کد خود گرافیک css بنویسید.
کد های نوشته شده برای User را برای سایر جداول (post , user category , post category) نیز بنویسید.

آموزش زبان ++C - مقدمه

آموزش برنامه نویسی ++C – دستور Switch

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

توضیحات: می توانیم case اول را به عنوان if و case های بعدی را به عنوان else if ها در نظر بگیریم و default آخر را هم به عنوان else.
مثال: برنامه ای بنویسید که عددی از ورودی گرفته اگر عدد ۱ ( if ) بود hello و یا اگر ( else if )2 بود bye و اگر ۱ و ۲ نبود goodbye را چاپ کند (else ).
ما برنامه را هم با استفاده از if و هم با استفاده از switch می نویسیم.

If

Switch

خروجی

switch_c++_1
توضیحات: اگر این برنامه را اجرا کنید حواب آن دقیقا مانند برنامه ی قبل خواهد بود.

ادامه ی توضیحات switch

دلیل وجود دستور break بعد از هر دستور case این است که بعد از اجرا شدن دستور case برنامه به بیرون از دستور شرطی switch بیاید.
مثال:
برنامه ی زیر را در نظر بگیرید

خروجی
switch_c++_2
توضیحات: هنگام وارد کردن عدد در خروجی برای مقدار دهی متغیر a اگر مقدار ۱ را وارد کنید هم hello و هم bye چاپ می شود در حالی که تنها باید hello چاپ شود و دلیل آن هم نگذاشتن دستور break بعد از دستور case اول است.
وقتی برنامه وارد switch می شود شرط اولین case را درست می بیند پس دستور جلویش را اجرا می کند ولی چون بعد از دستور break ندارد برنامه از switch خارج نمی شود و case بعد از خود را نیز اجرا می کند و چون در این case دستور break قرار دارد در این هنگام است که برنامه از دستور switch خارج می شود.

آموزش زبان ++C - مقدمه

آموزش برنامه نویسی در ++C – پارامتر های تابع و ارسال پارمتر به صورت call by value

پارامتر های تابع شامل دو قسمت هستند:
۱- صوری ( formal )
۲- واقعی ( actual )

صوری

به متغیر های تابع که هنگام ایجاد تابع ایجاد می کنیم تا در داخل تابع از آن ها استفاده کنیم پارامتر های صوری یا formal گویند.
مثال: ایجاد یک تابع

توضیحات: به متغیر های a و c پارامتر های صوری تابع گویند.

واقعی

پارامتر های واقعی یا actual یا آرگومان های تابع در واقع همان مقادیری هستند که هنگام استفاده از تابع در تابع main استفاده می کنیم.
مثال در تابع main :

توضیحات: مقادیر ۵ و ۶ که درهنگام فراخوانی تابع استفاده شده اند همان پارامتر های واقعی هستند.

ارسال پارامتر های تابع به روش call by value

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

خروجی:
output_call_by_value
توضیحات: همانطور که دیدید هنگامی که به مقدار a تابع main در داخل تابع f1 یک مقدار اضافه شد مقدار آن یک عدد زیاد شد اما مقدار a در داخل تابع main تغییر نکرد پس نتیجه می گیریم که در این روش ارسال پارامتر واقعی به تابع هر تغییر در پارامتر صوری تاثیری بر متغیر تابع main نمی گذارد.

آموزش زبان ++C - مقدمه

آموزش برنامه نویسی ++C – الگوریتم های پر کاربرد – قسمت دوم

در این مقاله قصد آموزش الگوریتم مرتب سازی تعویضی و یک الگوریتم برای جابجایی مقادیر دو متغیر بدون استفاده از متغیر کمکی.

مرتب سازی تعویضی

در الگوریتم های مرتب سازی قصدمان این است که اعداد یک آرایه ی عددی را  به صورت صعودی یا نزولی مرتب کنیم.
الگوریتم های مرتب سازی آرایه انواع مختلفی دارند مانند: حبابی ، تعویضی ، shell ، quick sort و… .
در این الگوریتم مرتب سازی هر اندیس آرایه با اندیس های بعد از خود مقایسه می شود و طبق شرط مقایسه ی مان اعداد آرایه را مرتب می کنیم.
شرط مقایسه :
صعودی: اگر این عدد از این اندیس آرایه بزرگتر از اعداد بعد از خود بود آن ها را با هم تعویض کن.
نزولی: اگر این عدد از این اندیس آرایه کوچکتر از اعداد بعد از خود بود آن ها را با هم تعویض کن.

توضیحات الگوریتم مرتب سازی

فرض کنید آرایه ی ما این باشد:

روش مرتب سازی به این صورت خواهد بود:
گام اول: اندیس صفرم یعنی ۳ ابتدا با ۰ بعد با ۱ سپس با ۲ و سپس با ۵ مقایسه می شود
گام دوم: اندیس یک یعنی ۰ با ۱ و ۲ و ۵ مقایسه می شود
و در گام های بعدی هم به همین صورت ادامه خواهد داشت.
در تصویر می توانید بهتر متوجه شوید:
sort_tavizi
مقایسه ها با خط نمایش داده شده است.
کد

خروجی:
Osort

توضیحات: ما ابتدا یک آرایه تعریف کردیم با یک متغیر به نام temp که بتوانیم با استفاده از آن مقادیر آرایه را جا به جا کنیم سپس در for تودرتو الگوریتم مرتب سازی را اجرا کردیم و در for بعدی آرایه ی مرتب شده را نمایش دادیم.
شرط ما در if این است که اگر مقدار اندیس آرایه با مقدار اندیس های بعد از خود بزرگتر بود آن ها را با متغیر کمکی جابجا کن.
برای اینکه ما دو مقدار از دو اندیس آرایه را با هم جابه جا کنیم به یک متغیر کمکی نیاز داریم و به همان صورت که در داخل بلوک if میبینید دو مقدار را جابه جا می کنیم.
در این شرط آرایه ما آرایه را به صورت صعودی مرتب کردیم ولی اگر شما بخواهید آن را به صورت نزولی مرتب کنید فقط کافیست شرط آرایه را بر عکس کنید به صورت:

جابجایی مقادیر دو عدد بدون استفاده از متغیر کمکی

برای جا به جایی دو مقدار در دو متغیر ما به متغیر کمکی نیاز داریم ولی اگر کسی بخواهد بدون استفاده از آن متغیر کمکی دو مقدار را جا به جا کند باید چه کار کرد؟
ما می توانیم با استفاده از عملگر های محاسباتی آن دو مقدار را جا به جا کنیم.

خروجی:
jabejayi

آموزش زبان ++C - مقدمه

آموزش برنامه نویسی ++C – الگوریتم های پرکاربرد – قسمت اول

الگوریتم جست و جوی خطی (Linear Search) در آرایه ها:

این الگوریتم برای پیدا کردن مقادیر مورد نظر ما بکار می رود. در واقع ساده ترین جستجوگر ممکن در زبان های برنامه نویسی می باشد. روش این الگوریتم روش مقایسه است بطور مثال در یک آرایه ده عضوی تا زمان پیدا کردن عدد مورد نظر ، آن عدد را با تمام خانه های آرایه مقایسه می کند و این موضوع یکی از معایب آن به حساب می آید زیرا اگر آرایه ما متشکل از چندین هزار خانه باشد تا یافتن آن مقدار باید عدد وارده را با تمام وخانه مقایسه کند بطوریکه اگر آن را نیابد تمام چنیدن هزار خانه را یک دور با آن مقدار مقایسه می کند.
آموزش برنامه نویسی ++C – الگوریتم های پرکاربرد – قسمت اول
برای مثال اگر عدد مورد نظر ما ۵ باشد ابتدا چک می کند که آیا ۵ و ۱۴ برابر هستند یا نه در صورت نابرابری به خانه بعد می رود و آنقدر آین کار را انجام می دهد تا عدد را پیدا کند.
حال به نحوه نوشتن کد این جستجوگر دقت کنید.

الگوریتم مرتب سازی حبابی آرایه (Bubble Sort)

این الگوریتم در واقع مجموعه ای از مقادیر را در قالب یک آرایه دریافت می کند و آن ها را بر اساس نیاز ما از کوچک به بزرگ یا از بزرگ به کوچک دسته بندی می کند.تعداد مراحلی که طول می کشد تا این الگوریتم داده هارا مرتب کند در صورتی که n همان تعداد اعداد باشد n-1 می باشد
به تصویر زیر توجه کنید:
آموزش برنامه نویسی ++C – الگوریتم های پرکاربرد – قسمت اول

و کد آن هم بصورت ذیل می باشد.
توجه: شرح کد همان تصویر بالا می باشد.

آموزش برنامه نویسی ++C – الگوریتم های پرکاربرد – قسمت اول

آموزش زبان ++C - مقدمه

آموزش زبان برنامه نویسی ++C – برنامه نویسی ++C با کامپایلر لینوکس

در این مقاله قصد داریم به شما چگونگی برنامه نویسی به زبان c++ و قواعد آن را با یکی از کامپایلر های لینوکس آموزش دهیم.
شما باید یکی از توزیع های لینوکس ( ابونتو یا دبیان یا فدورا و یا… ) را انتخاب کرده و آن را نصب کنید.
در حال حاضر من از یک توزیع دبیان استفاده می کنم.
debian

نام کامپایلر C++ در لینوکس که می خواهیم از آن استفاده کنیم g++ است.
در بیشتر توزیع های لینوکس این کامپایلر بر روی سیستم به طور پیش فرض نصب شده است ولی اگر در توزیع لینوکسی که شما انتخاب کرده اید این برنامه نصب نباشد :
ابتدا یک ترمینال باز کنید
سپس با این دستور می توانید آن را نصب کنید:

اگر دسترسی سطح root را نداشته باشید از شما رمز root را در خط بعد گرفته و سپس سیستم به نصب نرم فزار می پردازد.
برای اینکه شما به زبان C++ در لینوکس برنامه بنویسید باید ابتدا دستورات خود را در یک فایل با فرمت cpp ذخیره کنید سپس این فایل را کامپایل کنید و فایل خروجی را اجرا کنید.
ایجاد فایل با ترمینال: می توانید از نرم فزار های notepad,leafpad,nano,vi کمک بگیرید که من نرم افزار nano را به شما پیشنهاد می کنم.
اگر نرم افزار نصب نبود با این دستور آن را نصب کنید:

سپس با استفاده از این نرم افزار یک فایل برای مثال a با فرمت cpp ایجاد می کنیم:

چنین صفحه ای پیش روی شما باز می شود:
nano_software

شروع کد نویسی :

۱- هدر فایل : در حال حاضر در سطح آشنایی با کامپایلر شما فقط می توانید از هدرفایل iostream استفاده کنید. دقت داشته باشید که نباید .h را در انتهای هدرفایل بگذارید.
headerf_linux
۲- در این کامپایلر لینوکس شما حتما باید خط مربوط به فضای نام را بنویسید که اگر ننویسید کامپایلر در هنگام کامپایل خطا می گیرد و برنامه ی شما کامپایل نمی شود.

۳- قواعد نوشتن تابع main مانند نوشتن تابع main در توربو است.
برنامه ی ما تا اینجا :
divc-_linux
۴- دستورات تعریف متغیر یا ایجاد حلقه هایی مانند while یا for و… و دستورات شرطی if و switch و تعریف تابع و… در این کامپایلر مانند کامپایلر Turbo C++ است.
مثال: چاپ در خروجی با دستور cout
چون پس از اجرا برنامه و نوشته شدن hello world در خط فرمان ترمینال ایجاد می شود در آخر دستور یک \n می گذاریم.
۵- کامپایل کردن برنامه: ابتدا فایلی که در آن برنامهمان را نوشته ایم save می کنیم با زدن کلید های Ctrl+X سپس y را زده و برای تایید Enter را فشار می دهیم. حالا می خواهیم برنامه را در خط فرمان کامپایل کنیم با این دستور:
خروجی برنامه در فایل a.out قرار می گیرد.
compile_c++
نشان می دهد که برنامه با موفقیت کامپایل شده است.
۶- اجرا برنامه : با نوشته این دستور
خروجی:
outputc-_linux
برنامه ی کامل:
سی شارپ #C

آموزش برنامه نویسی #C _انعطاف پذیری حلقه for

۱) ابتدا کنترل Button دیگری روی فرم برنامه قبلی اضافه کنید.خاصیت Name آن را برابر btnNewForLoop و خاصیت Text آن را برابر New For Loop قرار دهید.
۲) روی این کنترل دو بار کلیک کنید و کد زیر را در متد مربوط به رویداد Click آن وارد کنید.

۳)برنامه را اجرا کنید و روی دکمه New For Loop جدید کلیک کنید. نتیجه مشابه شکل زیر دریافت می کنید.
آمزش برنامه نویسی C#

چگونه کار می کند ؟
به تعریف حلقه for در این مثال توجه کنید:

نکته اولی که در این حلقه وجود دارد تعریف متغییر intcont در خود حلقه است. این مورد باعث می شود برنامه هنگامی که به حلقه رسید متغییری به نام intcont تعریف کند و برای شمارش درون حلقه از آن استفاده کند . هنگامی که کار حلقه به پایان رسید ، متغییر نیز از بین خواهد رفت و فضای اشغال شده توسط آن آزاد می شود. در مرحله بعد، به جای استفاده از عدد ۱ به عنوان مقدار شروع ، از عدد ۴ استفاده کرده ایم. در حقیقت در اولین دوره اجرای حلقه مقدار intcont برابر عدد ۴ است و بنابرین اولین مورد اضافه شده به لیست عدد ۴ خواهد بود . همچنین در هر مرحله از اجرای حلقه ، ۷ واحد به مقدار intcont افزوده می شود .به همین دلیل ، دومین موردی که به لیست اضافه می شود عدد ۱۱ است ، نه عدد ۵٫
با وجود اینکه حلقه باید در عدد ۶۲ به پایان برسد . اما مشاهده می کنید که حلقه در عدد ۶۰ به پایان می رسد. زیرا عدد بعد از آن ،۶۷ خواهد بود که از ۶۲ بزرگتر است. بنابراین حلقه برای مرتبه نهم اجرا نخواهد شد.
شمارش معکوس در حلقه:
اگر در هر مرحله از اجرای حلقه عددی را از شمارنده ی آن کم کنید ، حلقه به صورت معکوس حرکت خواهد کرد.
۱) اگر هنوز برنامه قسمت قبل در حال اجراست آن را ببندید و سپس کنترل Button دیگری به فرم اضافه کنید . خاصیت Name آن را برابر btnBackwardsForLoop و خاصیت Text آن برابر Backwards For Loop
قرار دهید .

۳) برنامه را اجرا کنید و روی دکمه Backwards For Loop کلیک کنید . نتیجه ای مشابه شکل زیر مشاهده خواهید کرد.
آموزش برنامه نویسیC#
همانطور که در قسمت سوم تعریف حلقه مشاهده می کنید ، در هر مرتبه اجرای حلقه ، استفاده از عملگر — موجب می شود یک واحد از مقدار intcont کم شود . چون مقدار اولیه این متغییر برابر ۱۰ در نظر گرفته شده است ، حلقه ۱۰ بار اجرا می شود و از عدد ۱۰ به صورت معکوس به عدد ۱ می رسد و اجرای حلقه تمام می شود .

سی شارپ #C

آموزش برنامه نویسی #C – حلقه ها

با سلام در این جلسه میخوام ادامه مبحث حلقه ها را براتون توضیح بدهم با ما همراه باشید

چگونه کار می کند

در ابتدای متد مربوط به رویداد کلیک، متغییری را به صورت زیر تعریف می کنیم :

برای ایجاد یک حلقه باید از کلمه کلیدی for استفاده کنید.این کلمه به کامپایلر ویژوال #C میگویید که میخواهید یک حلقه با تعداد دفعات تکرار مشخص ایجاد کنید . تمام کلمات و علامتهایی که بعد از این کلمه می آیند ، برای مشخص کردن نحوه عملکرد این حلقه به کار می روند . برای تعیین نحوه کارکرد یک حلقه ، سه مورد را باید در جلوی آن مشخص کنید . این سه مورد ، همانطور که در کد مشاهده می کنید با کاراکتر “;” از یکدیگر جدا می شوند.

آموزش زبان برنامه نویسی C#

در قسمت اول باید مشخص کنید که از چه متغییری می خواهید برای شمارش دفعات تکرار در این حلقه استفاده کنید . همچنین در این بخش مقدار اولیه متغییر را نیز تعیین کنید . به عبارت دیگر در این قسمت باید مشخص کنید که می خواهید شمارش در حلقه از چه عددی شروع شود . در این مثال برای شمارش حلقه از متغییر intCount که در خط قبل تعریف کردیم ، استفاده می کنیم و مقدار اولیه آن را نیز ۱ تعیین میکنیم تا شمارش حلقه از عدد یک شروع شود .
در قسمت دوم باید تعیین کنیم که حلقه ، شمارش را تا چه عددی ادامه دهد . در این مثال تا زمانی که متغییر intCount کوچکتر و یا مساوی ۵ است شمارش ادامه پیدا می کند . توجه داشته باشید که برای شرط این قسمت ازهر یک از عملگرهایی که در بخش قبل معرفی کردیم همانند عملگر بزرگتر مساوی و یا عملگر کوچکتر و … می توانید استفاده کنید .
در قسمت آخر مشخص کنید که مقدار متغییر در هر مرحله باید چه تغییری کند. در این مثال می خواهیم مقدار متغییر را در هر مرحله از اجرای حلقه یک واحد افزایش یابد. بنابراین در این قسمت مقدار متغییر را با عدد یک جمع کنیم.
از توضیحات قبلی مشخص است که این حلقه از عدد یک شروع به شمارش می کند وتا عدد ۵ شمارش را ادامه می دهد ودر هر مرحله نیز یک واحد متغییر اضافه می کند .بنابراین دستورات داخل حلقه پنج بار اجرا می شوند.
دوستان گرامی امیدوارم از این قسمت به خوبی استفاده کرده باشید ، شما دوستان عزیز می توانید نظرتون رو از طریق بیان دیدگاه ها با من و دیگر همکارانم به اشتراک بگزارید، همچنین می توانید از طریق صفحه ی ما در اینستاگرام به همین نشانی ما رو دنبال کنید.

Object-oriented

آموزش شئ گرایی Java – چند ریختی Polymorphism

چند ریختی Polymorphism مهمترین مبحث شئ‌گرایی

از الان تا آینده محور آموزش روی مبحث چند ریختی Polymorphism هستش… در تمام زبان‌های برنامه‌نویسی شئ‌گرا و در همه‌ی مباحث اصلی و فرعی و Design Patternها چند ریختی Polymorphism به شکل‌های مختلف دیده میشه!
اول از توضیح شروع میکنم و بعد نمونه کد رو بهتون نشون میدم.
خب اول از همه اگه مبحث Inheritance رو بلد باشید میدونید که در اونجا یک Property بود که از کلاس بالاتر از خودش ارث میبرد اما اینجا یک Method در یک کلاس زیر مجموعه‌ی خودش Override میشه!
برای مثال اگه شما یک متد به نام دریافت در یک سیستم حساب بانکی رو در نظر بگیرید ، دریافت وجه در یک حساب بلند مدت معنی ندارد و فقط در کلاس‌های BankAccount و CreditAccount دریافت وجه معنی داره و تو کلاس SavingAccount هیچ معنی نمیده چون شما از یک سپرده‌ی بلند مدت بانکی پول دریافت نمی‌کنید!
پس در اینجا متد Withdraw که نقش برداشت از حساب رو داره چند ریختی هستش… این یعنی چند ریختی Polymorphism.
نمونه کد زیر متد Withdraw رو در چند کلاس بهتون نشون میدیم تا چند ریختی Polymorphism رو بطور کامل درک کنید.

با پنگوئن همراه باشید 🐧