در حال بارگذاری...

اضافه‌بار متد

در یک کلاس دو متد بگذارید که هر دو نام paint را به کار ببرند. یک سرصفحه static void paint(string word) است. دیگری static void paint(int n) است. بدنه‌ها کوتاه‌اند: اولی word را می‌نویسد، دومی n را می‌نویسد. از Main صدا بزنید paint("ok"); و بعد paint(3);. صفحه باید دو خط نشان دهد: اول ok و بعد 3. C# متد دوم paint را برخورد نمی‌داند. دو سرصفحه را متدهای متفاوت می‌داند چون فهرست پارامترها فرق دارند. همین نام مشترک با فهرست‌های متفاوت چیزی است که این صفحه آموزش می‌دهد. نام کلاس عمومی را Pine نگه دارید.

همان نام، فهرست‌های متفاوت

تا الان هر ایدهٔ تازه نام متد تازه‌ای داشت: ring، greet، twice. اینجا عمداً نام paint می‌ماند. چیزی که عوض می‌شود بین پرانتزهاست. یک فهرست یک string نگه می‌دارد. فهرست دیگر یک int. کامپایلر هر دو را نگه می‌دارد چون آن فهرست‌ها یکی نیستند.
فایل Pine را باز کنید. نام کلاس Pine می‌ماند. این صفحه نوع را عوض نام نمی‌کند. اگر هنوز دموی twice که n * 2 برمی‌گرداند همهٔ چیزی است که در Main دارید، پاکش کنید. هر باقی‌ماندهٔ greet را پاک کنید. هر خط ReadLine را هم پاک کنید. فایلی که نگه می‌دارید منتظر تایپ نیست.
بیرون از Main، هنوز داخل آکولادهای کلاس، هر دو سرصفحهٔ paint را بنویسید. در این صفحه void را نگه دارید: هر بدنه می‌نویسد و چیزی لازم نیست از راه return به Main برگردد. بدنهٔ اول Console.WriteLine(word); را به کار می‌برد. بدنهٔ دوم Console.WriteLine(n); را. پیش از اجرا فایل را ذخیره کنید. برنامهٔ کامل اول در جعبهٔ بعدی است.

فایلی که نگه می‌دارید

این نسخه‌ای است که اول اجرا می‌کنید. Main دو فراخوانی نگه می‌دارد. کلاس دو متد paint نگه می‌دارد که یک نام مشترک دارند.

paint string and paint int

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("ok");
        paint(3);
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }

    static void paint(int n)
    {
        Console.WriteLine(n);
    }
}

از بالا بخوانید. using System; نام‌های کوتاه را آماده می‌کند. public class Pine نوع را نام می‌گذارد. public static void Main() جایی است که زمان اجرا شروع می‌کند. فراخوانی اول paint("ok") است. آرگومان یک string است، پس C# بدنه‌ای را اجرا می‌کند که string word می‌گیرد و ok می‌نویسد. فراخوانی دوم paint(3) است. آرگومان یک int است، پس C# بدنه‌ای را اجرا می‌کند که int n می‌گیرد و 3 می‌نویسد. نام paint هر دو بار یکسان است. فهرست داخل پرانتز همان چیزی است که بدنه را برمی‌گزیند. روی صفحه دو خط: ok، بعد 3.

با dotnet run اجرا کنید. برنامه دو خط می‌نویسد و تمام می‌شود. منتظر نمی‌ماند که شما چیزی تایپ کنید. اگر dotnet run منتظر ماند، هنوز ReadLine داخل فایل است. آن خط را پاک کنید و دو فراخوانی paint به‌همراه دو متد paint بالا را نگه دارید. صفحه ok، بعد 3 را نشان می‌دهد. اگر هر دو خط ok نشان دهند، شاید فقط متد string مانده و برای هر فراخوانی واژهٔ ثابت نوشته‌اید. اگر هر دو خط 3 نشان دهند، شاید فقط متد int مانده. هر دو سرصفحه را نگه دارید. اگر ساخت بگوید paint از قبل تعریف شده، چک کنید آیا هر دو سرصفحه یک فهرست دارند — مثلاً دو کپی از paint(string word). اضافه‌بار به تفاوت واقعی در فهرست نیاز دارد، نه کپی دوم همان سرصفحه فقط با نام پارامتر متفاوت. برای صفحه‌ای که خط اشتباه نشان می‌دهد SDK دات‌نت را دوباره نصب نکنید.

فهرست دوم با دو واژه

شمار پارامتر هم می‌تواند فرق کند. اضافه‌بار سومی اضافه کنید که دو مقدار string بگیرد و آن‌ها را با یک فاصله در یک خط بنویسد. وقتی هر سه را با هم تمرین می‌کنید، دو متد paint اول را سر جایشان بگذارید. برای دموی متمرکز همین شکل به‌تنهایی، می‌توانید فایلی نگه دارید که فقط همین فهرست را دارد.

paint two strings

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("hi", "sam");
    }

    static void paint(string a, string b)
    {
        Console.WriteLine(a + " " + b);
    }
}

این فایل دوم است. شمار را به‌عنوان تفاوت فهرست آموزش می‌دهد. با dotnet run اجرا کنید. صفحه باید یک خط نشان دهد: hi sam. فراخوانی دو آرگومان دارد. متد دو پارامتر دارد. همان جور بودن برای انتخاب این بدنه توسط C# کافی است. اگر هنوز paint(string word) و paint(int n) قبلی در همان کلاس هستند، می‌توانید نگهشان دارید. فراخوانی با دو مقدار string متد یک‌آرگومانی string را برنمی‌گزیند، چون شمار فرق دارد.
وقتی هر سه اضافه‌بار را در یک فایل برای تمرین می‌گذارید، Main می‌تواند هر شکل را در خط خودش صدا بزند. فراخوانی با یک string هنوز به paint(string word) می‌رود. فراخوانی با یک int هنوز به paint(int n) می‌رود. فراخوانی با دو مقدار string به paint(string a, string b) می‌رود. نام مشترک آن تمایزها را پاک نمی‌کند. بعد از دیدن hi sam، اگر شکل ذخیره‌ای که می‌خواهید دو فراخوانی است، فایل نگه‌داشتنی را برگردانید: paint("ok"); بعد paint(3);.

فهرست خالی کنار فهرست string

متدی با پرانتز خالی هم فهرست متفاوتی است. می‌توانید paint() بدون پارامتر را کنار paint(string word) نگه دارید. فراخوانی خالی paint(); بدنهٔ فهرست خالی را اجرا می‌کند. فراخوانی paint("go"); بدنهٔ string را اجرا می‌کند.

paint empty and paint string

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint();
        paint("go");
    }

    static void paint()
    {
        Console.WriteLine("ready");
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }
}

این فایل سوم است. با dotnet run اجرا کنید. صفحه باید اول ready و بعد go نشان دهد. فراخوانی اول بین پرانتز چیزی ندارد، پس با paint() جور است. فراخوانی دوم یک string می‌فرستد، پس با paint(string word) جور است. عوض‌نام کردن یکی به paintReady هم ساخته می‌شود، ولی مهارت دیگری است. این صفحه نام paint را نگه می‌دارد و می‌گذارد فهرست‌ها تفاوت را حمل کنند.

کدام فراخوانی کدام سرصفحه را اجرا می‌کند

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

📊 call beside matching paint

Call in Main Header that runs Screen line
paint("ok"); paint(string word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(string a, string b) hi sam
paint(); paint() ready

اشتباه رایج نوشتن دو متد است که هر دو paint(string word) می‌گویند و انتظار دارید دومی اضافه‌بار حساب شود. عوض کردن فقط نام پارامتر به paint(string label) برای کامپایلر فهرست تازه‌ای نمی‌سازد. اینجا نوع و شمار مهم‌اند. اشتباه دیگر صدا زدن paint(true) است وقتی هرگز فهرست پارامتر bool ننوشته‌اید. آن‌وقت ساخت نمی‌تواند paint جور پیدا کند. سرصفحه‌ای اضافه کنید که نوع موردنظر را بگیرد، یا فراخوانی را به نوعی که از قبل پشتیبانی می‌کنید عوض کنید.
نوشتن Console.WriteLine("paint"); در Main واژهٔ paint را می‌نویسد. هیچ متدی را صدا نمی‌زند. وقتی می‌خواهید اضافه‌باری که string می‌گیرد، paint("ok"); را نگه دارید. گذاشتن متد باقی‌ماندهٔ twice در همان فایل می‌تواند صفحه را گیج کند اگر Main هنوز twice(7) بنویسد. Main را تا فراخوانی‌های paint که در حال تست هستید پاک کنید و فقط اضافه‌بارهای paint لازم برای آن اجرا را نگه دارید.
متد paint را داخل آکولادهای Main تودرتو نکنید. متدها داخل کلاس، کنار Main می‌نشینند. دو اضافه‌بار دو متد خواهر در همان بدنهٔ کلاس‌اند.

حالا می‌توانید یک نام متد و چند فهرست پارامتر را در همان کلاس نگه دارید. C# بدنه را از فهرست آرگومان فراخوانی برمی‌گزیند. صفحه خط بدنه‌ای را نشان می‌دهد که جور شده. دو سرصفحه با یک فهرست اضافه‌بار نیستند. صفحهٔ بعدی scope است؛ آنجا می‌بینید کدام نام‌ها داخل متد دیده‌می‌شوند و کدام بیرون می‌مانند.

صفحه بدنهٔ جور را نگه می‌دارد

فایلی که نگه می‌دارید وقتی Main صدا می‌زند paint("ok"); و paint(3);، اول ok بعد 3 می‌نویسد. نام مشترک paint در هر فراخوانی است، و حرف‌های paint روی صفحه به‌عنوان برچسب چاپ‌شده نیستند مگر گیومه دورشان گذاشته باشید. تودرتو کردن متد paint داخل Main شکل این درس نیست.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
5
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود