زنگ سی شارپ – قسمت بیست و ششم

return کردن object از متد، Method Overloading و overload کردن constructor


مسعود درویشیان ۴۸ دیدگاه سی شارپ جمعه, ۲۷ام بهمن , ۱۳۹۱ 33819 بازدید

در قسمت قبل با چکونگی ارسال argument از طریق reference و همچنین با کلمات کلیدی out، ref و params آشنا شدید. در این قسمت قصد داریم با return کردن object از متد، Method Overloading و overload کردن constructor آشنا شویم.

زنگ سی‌شارپ - قسمت بیستم و چهارم

Return کردن object از متد

تا این‌جا type های مختلفی را از یک متد return می‌کردیم البته در سی‌شارپ شما می‌توانید هر data type ای را از یک متد return کنید مثل int، double، float و… اما در این‌جا قصد داریم چیز دیگری را از متد بازگردانیم: class types.

در برنامه‌ی زیر کلاسی به اسم Person وجود دارد که در این کلاس متدی به اسم ()CreateNewPerson است که یک شیء از جنس Person می‌سازد و این شیء را return می‌کند:

using System;
class ReturnObExample
{
    static void Main()
    {
        Person firstPerson = new Person("Catherine", "Gilbert");
        Console.Write("Fist Person = ");
        firstPerson.Show();

        Person secondPerson = firstPerson.CreateNewPerson("Damon", "Salvatore");

        Console.Write("Second Person = ");
        secondPerson.Show();
    }
}
class Person
{
    string Name, Family;

    public Person(string name, string family)
    {
        Name = name;
        Family = family;
    }

    public Person CreateNewPerson(string name, string family)
    {
        Person ob = new Person(name, family);
        ob.Name = name;
        ob.Family = family;
        return ob;
    }

    public void Show()
    {
        Console.WriteLine("Name: {0}, Family: {1}", Name, Family);
    }
}

همان‌طور که می‌بینید secondPerson را توسط متد ()CreateNewPerson از شیء firstPerson به‌وجود آوردیم. در این متد یک شیء از جنس Person ساخته شده و نام و نام‌خانوادگی (از طریق پارامتر) به فیلدهای این شیء اختصاص می‌یابد و سپس reference این شیء return می‌شود. در متد ()Main متد ()CreateNewPerson از شیء firstPerson فراخوانی شده و شیء جدیدی که به‌وجود آورده است را به secondPerson متصل می‌کند. به این ترتیب یک شیء از جنس Person ساخته و به secondPerson reference متصل شد که دارای فیلدهای نام و نام‌خانوادگی مخصوص به خودش است.

Return کردن یک آرایه

از آن‌جا که آرایه‌ها در سی‌شارپ object هستند، یک متد همچنین می‌تواند یک آرایه را نیز return کند. برای مثال به برنامه‌ی بالا یک متد دیگر به اسم ()CreateFriends اضافه کردیم که در آرایه‌ای از جنس string یک سری اسم (اسامی دوستان) را ذخیره می‌کند و در نهایت توسط متد ()GetFriends این آرایه را return می‌کنیم:

using System;
class ReturnObExample
{
    static void Main()
    {
        Person firstPerson = new Person("Catherine", "Gilbert");
        Console.Write("Fist Person = ");
        firstPerson.Show();

        Person secondPerson = firstPerson.CreateNewPerson("Damon", "Salvatore");

        Console.Write("Second Person = ");
        secondPerson.Show();

        Console.WriteLine();

        firstPerson.CreatFriends("Stefan", "Damon", "Elena");
        string[] personFriends = firstPerson.GetFriends();

        Console.Write("Catherine's Friends: ");
        for (int i = 0; i < personFriends.Length; i++)
        {
            Console.Write(personFriends[i] + ", ");
        }
        Console.WriteLine();
    }
}
class Person
{
    string Name, Family;
    string[] Friends;
    public string[] GetFriends()
    {
        return Friends;
    }

    public Person(string name, string family)
    {
        Name = name;
        Family = family;
    }

    public Person CreateNewPerson(string name, string family)
    {
        Person ob = new Person(name, family);
        ob.Name = name;
        ob.Family = family;
        return ob;
    }

    public void Show()
    {
        Console.WriteLine("Name: {0}, Family: {1}", Name, Family);
    }

    public void CreatFriends(params string[] buddies)
    {
        Friends = new string[buddies.Length];

        for (int i = 0; i < buddies.Length; i++)
            Friends[i] = buddies[i];
    }
}

توجه کنید که متد ()GetFriends چگونه آرایه‌ای از جنس string را بازمی‌گرداند. شما می‌توانید آرایه‌ای با ابعاد بیشتر را نیز return کنید.

Method Overloading

در سی‌شارپ دو یا بیشتر از دو متد می‌توانند نام یکسانی داشته باشند، به‌شرطی که  تعریف پارامترهای آن‌ها متفاوت باشد. در این‌جور موارد گفته می‌شود که متدها overload شده‌اند و درکل به این پروسه method overloading گفته می‌شود. Method overloading یکی از جنبه‌های اجرای polymorphism (چند ریختی) است.

class Program
{

    static void Main()
    {
        MethodA();
        MethodA("");
    }

    static void MethodA()
    {
    }

    static void MethodA(string a)
    {
    }
}

همان‌طور که می‌بینید در مثال بالا دو متد هم‌نام به اسم ()MethodA داریم که یکی بدون پارامتر است و دیگری یک پارامتر از جنس string دارد. درکل برای overload کردن یک متد کافی است که ورژن‌های مختلفی از آن متد را تعریف کنید. برای این کار باید یک محدودیت را در هنگام overload کردن رعایت کنید: نوع یا تعداد پارامترهای هر متد overload شده باید با بقیه متفاوت باشد. همچنین کافی نیست که فقط return-type یک متد overload شده با دیگری متفاوت باشد بلکه نوع یا تعداد پارامترهای استفاده شده در آن باید با بقیه متدهای overload شده فرق کند.

به مثال زیر توجه کنید:

using System;
class MethodOverloading
{
    public int Addition(int a, int b)
    {
        return a + b;
    }
    public int Addition(int a, int b, int c)
    {
        return a + b + c;
    }
    public float Addition(float a, float b)
    {
        return a + b;
    }
    public float Addition(float a, float b, float c)
    {
        return a + b + c;
    }
}

//Now you can use those Addition method four types
class hub
{
    public static void Main()
    {
        MethodOverloading methOverload = new MethodOverloading();

        Console.WriteLine("Addition of two integers: "
            + methOverload.Addition(2, 5));

        Console.WriteLine("Addition of two double type values: "
            + methOverload.Addition(0.40f, 0.50f));

        Console.WriteLine("Addition of three integers: "
            + methOverload.Addition(2, 5, 5));

        Console.WriteLine("Addition of three double type values: "
            + methOverload.Addition(0.40f, 0.50f, 0.60f));
    }
}

در مثال بالا ما چندین ورژن از متد ()Addition را داریم که هر کدام از نظر نوع و تعداد پارامترهای استفاده شده در آن‌ها با بقیه متفاوت هستند و همچنین return-type آن‌ها هم می‌تواند متفاوت باشد. توجه کنید که overload کردن به شکل زیر کاملاً نادرست است:

// One OvlDemo(int) is OK.
public void OvlDemo(int a)
{
    Console.WriteLine("One parameter: " + a);
}

/* Error! Two OvlDemo(int)s are not OK even though
return types differ. */
public int OvlDemo(int a)
{
    Console.WriteLine(“One parameter: “ + a);
    return a * a;
}

توجه به این نکته ضروری است که overload کردن ربطی به return-type ندارد و تنها پارامترها و جنس پارامترها اهمیت دارند. در مثال بالا با توجه به این‌که return-type متفاوت است اما به‌دلیل یکی بودن پارامترها overload اتفاق نمی‌افتد و برنامه کامپایل نمی‌شود. در ویژوال استودیو هنگامی‌که یک متد را صدا می‌زنید که چندین overload دارد با چنین چیزی مواجه می‌شوید:

در این‌جا IntelliSense ویژوال استودیو به شما نشان می‌دهد که این متد چهار overload دارد و شما می‌توانید مقادیر مختلفی را به‌عنوان argument به این متد بدهید. کافی است که کلیدهای بالا و پایین را فشار دهید تا overload های این متد را مشاهده کنید.

همان‌طور که ذکر شد، method overloading یکی از جنبه‌های اجرای polymorphism است و باعث اجرای الگوی “one interface, multiple methods” می‎شود. مثلاً در زبانی مثل C که method overloading را ساپورت نمی‌کند هر متد باید یک اسم منحصربه‌فرد داشته باشد درحالی‌که شما مکرراً نیاز دارید تا توسط یک متد روی data type های مختلف کاری را انجام دهید. همان برنامه بالا که از متد ()Addition استفاده شده بود را در نظر بگیرید. اگر قرار بود این‌کار را توسط زبان C انجام دهیم می‌بایست چهار function مختلف با اسم‌های مختلف تعریف می‎کردیم درحالی‌که این چهار function همه‌گی یک کار یکسان را انجام می‌دهند. مسلماً این‌کار اندکی قضیه را پیچیده‌تر می‌کند زیرا با توجه به این‌که همه‌ی این function ها یک کار را انجام می‌دهند و مفهوم یکسانی دارند شما مجبورید ۴ اسم مختلف را به‌خاطر بسپارید. مثلاً متد ()WriteLine از کلاس Console نوزده overload دارد. تصور کنید در این موارد که تعداد overload ها زیاد است آن‌گاه تعریف کردن متدهای جداگانه با اسامی مجزا عملاً کار احمقانه‌ای است.

Overload Constructors

Constructor ها نیز می‌توانند همانند متدها overload شوند. این‌کار باعث می‌شود بتوانید به طرق مختلفی object های خود را بسازید. به مثال زیر توجه کنید:

// Demonstrate an overloaded constructor.
using System;
class MyClass
{
    public int x;

    public MyClass()
    {
        Console.WriteLine("Inside MyClass().");
        x = 0;
    }

    public MyClass(int i)
    {
        Console.WriteLine("Inside MyClass(int).");
        x = i;
    }
    public MyClass(double d)
    {
        Console.WriteLine("Inside MyClass(double).");
        x = (int)d;
    }

    public MyClass(int i, int j)
    {
        Console.WriteLine("Inside MyClass(int, int).");
        x = i * j;
    }
}
class OverloadConsDemo
{
    static void Main()
    {
        MyClass t1 = new MyClass();
        MyClass t2 = new MyClass(88);
        MyClass t3 = new MyClass(17.23);
        MyClass t4 = new MyClass(2, 4);

        Console.WriteLine("t1.x: " + t1.x);
        Console.WriteLine("t2.x: " + t2.x);
        Console.WriteLine("t3.x: " + t3.x);
        Console.WriteLine("t4.x: " + t4.x);
    }
}

خروجی:

در این‌جا ()MyClass چهار overload دارد که هر کدام باعث می‌شوند object به شکل متفاوتی ساخته شود. توسط کلمه‌کلیدی new و argument هایی که برای ساخت شیء به‌کار می‌برید، constructor مربوط به آن فراخوانی می‌شود و شیء را به‌وجود می‌آورد. با overload کردن constructor های کلاس، شما این امکان را به‌وجود می‌آورید که object ها به طرق مختلفی بتوانند ساخته شوند.

به مثال بعدی توجه کنید:

using System;
class Employee
{
    public int IdNumber;
    public double Salary;

    public Employee()
    {
        IdNumber = 999;
        Salary = 0;
    }
    public Employee(int empId)
    {
        IdNumber = empId;
        Salary = 0;
    }
    public Employee(int empId, double sal)
    {
        IdNumber = empId;
        Salary = sal;
    }
    public Employee(char code)
    {
        IdNumber = 111;
        Salary = 100000;
    }
}
public class CreateSomeEmployees
{
    public static void Main()
    {
        Employee aWorker = new Employee();
        Employee anotherWorker = new Employee(234);
        Employee theBoss = new Employee('A');

        Console.WriteLine("{0} --- {1}", aWorker.IdNumber,
        aWorker.Salary);

        Console.WriteLine("{0} --- {1}", anotherWorker.IdNumber,
        anotherWorker.Salary);

        Console.WriteLine("{0} --- {1}", theBoss.IdNumber,
        theBoss.Salary);
    }
}

در این برنامه چهار overload از ()Employee وجود دارد که هرکدام به‌نحوی باعث ساخت شیء می‌شوند.

درخواست یک overloaded constructor از طریق this

هنگامی‌که با constructor های overload شده کار می‌کنید، یک constructor می‌تواند، constructor دیگری را درخواست کند. این‌کار از طریق کلمه‌کلیدی this انجام می‌شود و فرم کلی آن به‌شکل زیر است:

constructor-name(parameter-list1) : this(parameter-list2) {
    // ... body of constructor, which may be empty
}

در این‌جا ابتدا با توجه به parameter-list2 یکی از constructor های overload شده اجرا می‌شود و سپس اگر کدی درون constructor اصلی (constructor اولیه) وجود داشته باشد، اجرا می‌شود.

به مثال زیر توجه کنید:

// Demonstrate invoking a constructor through this.
using System;
class AlphaBeta
{
    public int Alpha, Beta;
    public AlphaBeta() : this(0, 0)
    {
        Console.WriteLine("Inside AlphaBeta()");
    }
    public AlphaBeta(AlphaBeta obj) : this(obj.Alpha, obj.Beta)
    {
        Console.WriteLine("Inside AlphaBeta(obj)");
    }
    public AlphaBeta(int i, int j)
    {
        Console.WriteLine("Inside AlphaBeta(int, int)");
        Alpha = i;
        Beta = j;
    }
}
class OverloadConsDemo
{
    static void Main()
    {
        AlphaBeta ob1 = new AlphaBeta();
        AlphaBeta ob2 = new AlphaBeta(8, 9);
        AlphaBeta ob3 = new AlphaBeta(ob2);

        Console.WriteLine();
        Console.WriteLine("ob1.x, ob1.y: " + ob1.Alpha + ", " + ob1.Beta);
        Console.WriteLine("ob2.x, ob2.y: " + ob2.Alpha + ", " + ob2.Beta);
        Console.WriteLine("ob3.x, ob3.y: " + ob3.Alpha + ", " + ob3.Beta);
    }
}

خروجی:

به این نکته توجه کنید، پارامترهایی که بعد از this می‌آیند مشخص می‌کنند که کدامین constructor باید در ابتدا اجرا شود. مثلاً برای ()AlphaBeta که خودش پارامتری ندارد، (this(0, 0 دو عدد integer دارد و مشخص می‌کند که ابتدا باید آن constructor ای اجرا شود که دو پارامتر int دارد. بنابراین ابتدا محتویات (AlphaBeta(int i, int j اجرا شده و سپس محتویات ()AlphaBeta اجرا می‌شود. در مورد (AlphaBeta(AlphaBeta obj نیز مراحل به‌ترتیب قبل است. (This(obj.Alpha, obj.Beta دو عدد int گرفته است بنابراین ابتدا محتویات (AlphaBeta(int i, int j اجرا شده و سپس محتویات (AlphaBeta(AlphaBeta obj اجرا می‌شود. یکی از مزایای این کار این است که از کدنویسی اضافی جلوگیری می‌کند. با این‌کار شما دیگر در هر constructor نیاز ندارید که برای مقداردهی به Alpha و Beta کد تکراری بنویسید.

به مثال دیگری در این زمینه توجه کنید:

using System;
class Mouse
{
    public Mouse()
        : this(-1, "")
    {
        // Uses constructor initializer.
    }

    public Mouse(int weight, string name)
    {
        // Constructor implementation.
        Console.WriteLine("Constructor weight = {0}, name = {1}",
            weight,
            name);
    }
}

class Program
{
    static void Main()
    {
        // Test the two constructors for Mouse type.
        Mouse mouse1 = new Mouse();
        Mouse mouse2 = new Mouse(10, "Sam");
    }
}

تمرین شماره ۱۴: در این تمرین می‌بایست یک جعبه‌ی موسیقی درست کنید. این جعبه موسیقی، باید چندین هنرمند داشته باشد و هر هنرمند می‌تواند چندین آلبوم و تک آهنگ داشته باشد. همچنین می‌بایست قابلیت Play و Stop کردن را به این جعبه موسیقی بدهید و بتوانید آلبوم‌ها و آهنگ‌ها را حذف و اضافه کنید.

راهنمایی:

using System;
using System.Media;
class MyClass
{
    static void Main()
    {
        SoundPlayer myPlayer = new SoundPlayer(@"c:\mywavfile.wav");
        myPlayer.Play();
        myPlayer.Stop();
    }
}

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

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



نویسنده / مترجم : مسعود درویشیان

علاقه مند به موسیقی و برنامه نویسی بازی


۴۸ دیدگاه برای این نوشته ثبت شده است


  1. PetekDincos
    ۲۷ بهمن ۱۳۹۱

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




  2. ehsan
    ۲۹ بهمن ۱۳۹۱

    سلام . تشکر بابت اموزش های خوبتون .




  3. داوود
    ۲۹ بهمن ۱۳۹۱

    سلام مسعود جان؛
    ممنونم که برگشتی و مجددا مثل گذشته داری طبق برنامه ریزی که گفتی درسها رو ارائه میدی! نمیشه تمرینی رو که میذاری بعد دو جلسه حلش رو ارائه بدی؟ یعنی یک درس تنفس بدید تا ما اگه تو یه هفته فرصت نکردیم ؛ این شانس رو داشته باشیم که در هفته بعدش حل تمرین رو بذاریم؟
    ببخشید که تعیین تکلیف می کنم.
    موفق باشید انشاءالله.




    • مسعود درویشیان
      ۲۹ بهمن ۱۳۹۱

      سلام. اتفاقاً قصد داشتم همین‌کار رو کنم و واسه تمرین ۲ جلسه فرصت بدم. پس تمرین این قسمت رو توی ۲ هفته فرصت دارید انجام بدید
      موفق باشید




      • داوود
        ۳۰ بهمن ۱۳۹۱

        مجددا سلام؛ دستتون درد نکنه و خدا خیرتون بده! اینجوری خیلی بهتر شد. ممنون.
        ضمنا هر نفر چقدر میتونه سوال و یا مشکلی در زمینه برنامه فوق اگه داشت بپرسه؟ محدودیت خاصی داره؟؟؟




        • مسعود درویشیان
          ۳۰ بهمن ۱۳۹۱

          نه محدودیتی نداره هر سوالی خواستید بپرسید.




  4. داوود
    ۴ اسفند ۱۳۹۱

    سلام آقا مسعود؛
    در خصوص مبحث Return کردن object از متد این کار چه مزیتی دارد؟ خب اگر ما در این تکه کد:
    [C#]
    Person firstPerson = new Person(“Catherine”, “Gilbert”);
    Console.Write(“Fist Person = “);
    firstPerson.Show();

    Person secondPerson = firstPerson.CreateNewPerson(“Damon”, “Salvatore”);
    [C#/]
    به جای این کارها برای secondPerson یک شی جدید new می کردیم چه ایرادی داشت؟ اینجوی کمتر گیج می شیم که.
    مثلا اینجوری:
    [C#]
    Person secondPerson = new Person(“Catherine”, “Gilbert”);

    [C#/]




    • مسعود درویشیان
      ۴ اسفند ۱۳۹۱

      سلام. این مثال صرفاً برای نشون دادن اینه که شما می‌تونید متودهایی داشته باشید که شیء return می‌کنند و این مثال هم برای همین منظوره :)




  5. sina
    ۵ اسفند ۱۳۹۱

    مسعود جان شما هم خسته نباشی :) واقعا داری زحمت میکشی خیلی خیلی بیشتر از من :))




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      قربانت سینا جان… :)




  6. sina
    ۵ اسفند ۱۳۹۱

    مسعود جان این ایمیل نظرات چطوریه D: یه موقع منم از این ایمیل استفاده کردم ملت یه جوری زدن مارو تیکه پاره کردن خخخخخ

    فدات :)




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      نه این‌جا که استقبال می‌شه کسی هم تیکه پاره‌مون نکرده تا حالا! :دی




  7. sina
    ۵ اسفند ۱۳۹۱

    آره میدونم برای وبلاگ هایی مثل وبلاگ شما چون نظر دهنده بالای ۹۰ درصد دنبال آموزشه یا منتظر پاسخ به سوالشه واقعا میتونه مفید باشه :) وبلاگ هایی مثل من چون موضوعاتش همه گیر زیاد دلچسب نمیشه :))




  8. sina
    ۵ اسفند ۱۳۹۱

    راستی مسعود جان کار طراحیت فوقوالعادست :) وبلاگت بسیار زیبا و بینظیره الان از وقتی نظر گذاشتی اینجا مشغولم :) کاش زودتر میگفتی :((((




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      زحمت طراحی و ساخت سایت رو دوست عزیزم آقای امیر سروری کشیدن :)




  9. sina
    ۵ اسفند ۱۳۹۱

    به همتون خسته نباشید میگم :)




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      قربان محبتت :)




  10. sina
    ۵ اسفند ۱۳۹۱

    مسعود جان شما طراح حرفه ای هستی پیشنهادی چیزی در مورد وب من داری ؟ مرسی :)




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      سینا جان من خودم یکی از کسایی هستم که همیشه مطالب جذابت رو دنبال می‌کنم و نوع نگارشت رو می‌پسندم و البته بیشتر برنامه‌نویسی می‌کنم تا طراحی :)
      همه‌چی عالیه، عنوان مطالبت رو (تو صفحه اصلی) یکم بزگتر و bold کنی فکر کنم جالب بشه
      از نظر محتوا همه‌چی عالیه :)
      یه خبرنامه هم بذاری حرف نداره + فعالیت بیشتر توی شبکه‌های اجتماعی




  11. sina
    ۵ اسفند ۱۳۹۱

    ممنون مسعود جان :)
    خبرنامه کار نمیکنه ؟ پایین وبلاگ؟ اگه کار نمی کنم سریع حلش کنم.
    عنوان مطالب رو حتما مرسی :)
    شبکه های اجتماعی دارم یه نفرو میارم تو تیم که کلا رو این تمرکز کنه بازم ممنون یه دنیا تشکر :)




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      متوجه خبرنامه‌ات نشده بودم :)
      قربانت. موفق باشی




  12. sina
    ۵ اسفند ۱۳۹۱

    D: راستش من میخوام تمرکز روی وب باشه این خبرنامه رو مجبوری گذاشتم ، مسعود جان خودت که وارد و با تجربه ای ، الان عصر عصره فلیپ بورد، گوگل کارنت و ایناست خبرنامه رو مخه از بس دردسر داره خوشگلم نیست D:
    بازم فدات :)




  13. مهدی
    ۵ اسفند ۱۳۹۱

    سلام؛
    مرسی از دروسی که میذارید.
    در این خط چرا از this مثل مثال درس ۲۵ استفاده نکردین:
    string Name, Family;

    public Person(string name, string family)
    {
    Name = name;
    Family = family;
    }




    • مسعود درویشیان
      ۵ اسفند ۱۳۹۱

      مهدی جان همو‌ن‌طور که قبلاً هم گفتیم سی‌شارپ case-sensitive هست یعنی به حروف بزرگ و کوچیک حساسه و براشون تفاوت قائل می‌شه
      اینجا هم اگه توجه کنی حروف اولشون توی بزرگ و کوچک بودن تفاوت داره و این باعث می‌شه نیاز نداشته باشی از this استفاده کنی
      هرچند اگه اینجا استفاده کنی هم مشکل نداره اما در کل وقتی از this استفاده می‌کنیم که اسم فیلدها و property دقیقاً یکی باشه




      • مهدی
        ۵ اسفند ۱۳۹۱

        منظورتون از property ها همون پارامترهایی هستن که در متد اونها رو معرفی می کنیم؟
        مثل :
        (public void MyMethod(int a,int b
        در اینجا a,b پارامتر هستن در واقع ؛ property رو میشه توضیح بدید؟




        • مسعود درویشیان
          ۵ اسفند ۱۳۹۱

          اوه اوه!!! معذرت می‌خوام منظورم همون پارامتر هست. ببخشید :)




  14. داوود
    ۷ اسفند ۱۳۹۱

    سلام مسعود جان؛
    ببخشید مزاحم شدم.
    راستش یکم گیج شدم.
    در این خط و به اصطلاح شبه کد:
    public AlphaBeta(AlphaBeta obj)
    یعنی یک شی با نام obj ایجاد کردیم که شامل ۲ متغیر Alpha و Beta هستش دیگه؛ درسته؟
    یعنی فقط و فقط شامل متغیرهایی که گفتم هست و نه چیزه بیشتر یا کمتری!!!!!!!
    ممنونم




    • مسعود درویشیان
      ۹ اسفند ۱۳۹۱

      سلام داوود جان
      توی اون مثالی که کلاس AlphaBeta رو داریم، این کلاس ۳ تا constructor داره که overload شدن. یعنی وقتی قراره از این کلاس شیء بسازیم به سه طریق می‌توینم فیلدهای شیءای که دارین می‌سازیم رو مقداردهی کنیم (که فیلدهامون همون int Alph و int Beta هستن).
      خب، توی حالت اول که این‌جوری شیء می‌سازیم:

      AlphaBeta ob1 = new AlphaBeta();
      

      در واقع داریم این constructor رو صدا می‌زنیم:

      public AlphaBeta() : this(0, 0)
      {
          Console.WriteLine("Inside AlphaBeta()");
      }
      

      خب وقتی این constructor هم صدا زده شد، فیلدها مقداردهی شدن؟ نه‌خیر! توی این constructor عبارت (۰ ,۰)this یعنی حالا برو سراغ اون constructor ای که ۲ تا int می‌گیره و این ۲ تا صفر رو تحویلش بده. اون constructor ای که ۲ تا int می‌گیره این هست دیگه، درسته؟

      public AlphaBeta(int i, int j)
      {
          Console.WriteLine("Inside AlphaBeta(int, int)");
          Alpha = i;
          Beta = j;
      }
      

      خب حالا که اومد سراغ این constructor، صفر اولی رو میده به پارامتر i و صفر دومی هم میده به پارامتر j بعدشم این i و j میرن تو Alpha و Beta قرار می‌گیرن.
      حالا وقتی این‌طوری می‌خوایم شیء بسازیم:

      AlphaBeta ob3 = new AlphaBeta(ob2);
      

      ob2 یه شیء هست که قبلاً ساختیمش فیلدهاشم برابر با ۸ و ۹ هستن (خود مثال رو توی مقاله ببین). حالا که موقع ساخت، اومدیم شیء تحویش دادیم پس این constructor صدا زده می‌شه:

      public AlphaBeta(AlphaBeta obj) : this(obj.Alpha, obj.Beta)
      {
          Console.WriteLine("Inside AlphaBeta(obj)");
      }
      

      همین‌طور که می‌بینی، چیزی که اون‌ور به‌عنوان ob2 فرستادی، این‌ور به‌عنوان obj دریافت می‌شه. شیءای که فرستادی فیلدهاش مقدار داشتن دیگه درسته؟ پس حالا (this(obj.Alpha, obj.Beta یعنی ای کامپایلر عزیز، برو سراغ اون constructor ای که ۲ تا int می‌گیره، بی‌زحمت obj.Alpha و obj.Beta هم بده بهش (که توی این مثال ۸ و ۹ بودن) تا این شیء جدیدی که داریم می‌سازیم هم فیلدهاش همین مقدار رو داشته باشن :)
      پس دوباره میره سراغ این constructor:

      public AlphaBeta(int i, int j)
      {
          Console.WriteLine("Inside AlphaBeta(int, int)");
          Alpha = i;
          Beta = j;
      }
      

      و obj.Alpha رو میده به i و obj.Beta رو می‌ده به j :)
      ?You got it




      • داوود
        ۲۲ خرداد ۱۳۹۲

        ممنونم عزیزم؛ آره کاملا فهمیدم؛ البته معلوم نیست بتونم باهاش تمرین بنویسم ولی همینجوری که دارم نگاه می کنم کاملا فهمیدم چی به چی شده.
        Thanks a lot




  15. داوود
    ۸ اسفند ۱۳۹۱

    سلام؛
    ببخشید مزاحم میشم؛
    آقا مسعود من اومدم و بعد از کدهای شما در انتهای سازنده ها ، یک سازنده دیگری بدین نحو تعریف کردم:
    [C#]
    public AlphaBeta(int k)
    : this(0)
    {
    Alpha = k;
    Console.WriteLine(“for my test”);
    }
    [#C/]
    و در برنامه اصلی هم اینجوری نوشتم:
    AlphaBeta ob4 = new AlphaBeta(9);
    حالا پیغام خطا میده که این سازنده نمیتونه خودش ؛ خودش رو فراخوانی کنه!!
    Error ۱ Constructor ‘AlphaBeta.AlphaBeta(int)’ cannot call itself




    • مسعود درویشیان
      ۹ اسفند ۱۳۹۱

      فکر کنم جواب این سوالت هم توی اون یکی سوالت جواب دادم. یه نگاه بنداز اگه نامفهوم بود تا بیشتر توضیح بدم ;)




      • داوود
        ۲۲ خرداد ۱۳۹۲

        آره عزیزم؛ حق با شماست. مرسی از پاسخ خوبت.




  16. داوود
    ۸ اسفند ۱۳۹۱

    سلام؛
    مسعود جان اینکه گفتید قابلیت play داشته باشه یعنی باید از ابزار یا کامپوننتی برای اینکار استفاده کنیم؟
    آخه قابلیت Play و stop باید تو حالت ویژوالی نوشته بشن یا نه؟




    • مسعود درویشیان
      ۹ اسفند ۱۳۹۱

      توی قسمت راهنمایی گفتم که :) نه هیچ چیزی نمی‌خواد به ویژوال استودیو اظافه کنی. یه متد هست که play می‌کنه یه متد هم هست stop می‌کنه. حالا باید یه کاری کنی که آدرس آهنگت و این حرفا مشخص باشه وقتی متد play رو صدا زدی آهنگ شروع کنه به خوندن، وقتی هم stop رو زدی آهنگ قطع شه




      • داوود
        ۹ اسفند ۱۳۹۱

        ممنونم مسعود جان؛ دستت درد نکنه عزیزم، الان رسیدم خونه و دارم چک میکنم و ببخشید که زودتر جواب محبتای شما رو ندادم.
        قبل از اینکه توضیحتونو بخونم ابتدا ترجیح دادم ازتون تشکر بکنم. الان میخوام توضیحات شما رو بخونم اگه دیدم نمیفهمم مجددا مزاحم میشم.
        ضمنا قبلا دوست داشتیم که هر روز یه پست بذارید ولی الان میگم خوب شد اونجوری نشد، حتی گاها مثل الان که درسها داره سنگین تر میشه فکر کنم هر دو هفته؛ یک درس باشه بهتره.




        • مسعود درویشیان
          ۹ اسفند ۱۳۹۱

          قربانت :) نه همون هفته‌ای یک جلسه کفایت می‌کنه، شما هم سر فرصت هر وقت تونستید مقالات رو بخونید و تمرین کنید.




  17. احسان
    ۱۴ اسفند ۱۳۹۱

    سلام خیلی خیلی خسته نباشید




  18. داوود
    ۱۴ اسفند ۱۳۹۱

    سلام مسعود جان؛ شبت بخیر و خسته نباشی.
    من یه فایل صوتی دارم که خب براحتی با نرم افزارهای دیگه باز میشه و شروع به پخش موزیک میکنه! حالا میخواستم برای اول کار همین رو با تابع فوق انجامش بدم. صفحه مشکی رنگ همیشگی باز میشه که ازم درخواست میکنه برای ادامه یا همون خروج کلیدی رو بزنم ولی موزیک پخش نمیشه! چرا؟
    این هم تکه کدم که از کد شما کپی کردم:
    [C#]
    using System;
    using System.Media;
    class MyClass
    {
    static void Main()
    {
    SoundPlayer myPlayer = new SoundPlayer(@”C:\Documents and Settings\kh\Desktop\TestSong.wav”);
    myPlayer.Play();

    // myPlayer.Stop();
    }
    }
    [/C#]




    • مسعود درویشیان
      ۱۴ اسفند ۱۳۹۱

      یه ()Console.ReadLine بهش اضاف کن




  19. Amir
    ۲۸ اسفند ۱۳۹۱

    سلام
    تشکر از مطالب خوبتون
    واقعاً عالیه:)
    یه سؤال؟
    قبلاً تو ویژوال استادیو ۲۰۱۲ مینوشتم میخام بدونم راهی داره که اون پروژه ها رو تو ۲۰۱۰ اجرا کنم؟




  20. Mersad
    ۲۸ مرداد ۱۳۹۲

    سلام

    خداوند بهتون عزت بده.
    خسته نباشید بابت زحمات بی دریغتون در عرصه ی آموزش.

    یه سوال داشتم.
    در اولین مثال این جلسه در این متد :

         public Person CreateNewPerson(string name, string family)
        {
            Person ob = new Person(name, family);
            ob.Name = name;
            ob.Family = family;
            return ob;
        } 

    چه نیازی به این دو خط هست؟

        ob.Name = name;
            ob.Family = family; 

    چون تو همون تعریف شی ob داریم مقدار های name و family رو بهش میدیم ( توسط constractor )
    دیگه چرا دوباره باید اون دو خط بعدش رو بنویسیم؟
    من بدون اون دو خط تست کردم؛ درست جواب داد.




  21. HoSsEin
    ۳ شهریور ۱۳۹۲

    میشه قسمت کدهای بعد از this رو نذاریم ؟ (منظورم {} و کدهای بینش هست)؟ یعنی فقط برای جابجا کردن و دلبخواهی کردن چند تا آرگومنت از this استفاده کرد؟




    • مسعود درویشیان
      ۳ شهریور ۱۳۹۲

      {} رو که حتماً باید بذاری اما محتوای داخل {} اختیاریه و بستگی داره که داری چی‌کار می‌کنی
      همون‌طور که گفته شده کلاً این‌کار واسه اینه که از کدنویسی تکراری جلوگیری بشه.




  22. محمد
    ۱۲ شهریور ۱۳۹۳

    ایمیلتون چیه؟؟
    سوال قبلیمم ظاهرا جواب ندادید در درس قبل:(




  23. محمد
    ۱۳ شهریور ۱۳۹۳

    using System;
    using System.Media;
    class MyClass
    {
    static void Main()
    {
    SoundPlayer myPlayer = new SoundPlayer(@”C:\Users\someone\Downloads\1562.wav”);
    myPlayer.Play();
    Console.ReadLine();
    myPlayer.Stop();
    }
    }
    سلام.این چرا آ«هندلد اِکسپشِن می ده؟؟؟




  24. محمد
    ۱۷ شهریور ۱۳۹۳

    تا اینجا نوشتم امّا چرا اصلا اجرا نمی شه؟؟؟؟




  25. محمد
    ۱۷ شهریور ۱۳۹۳

    using System;

    class Sound
    {
    // instance var
    string title;
    string gener;
    string albume;
    int duration;

    //constructor
    public Sound(string t,string g,string a,int d)
    {
    title=t;
    gener =g;
    albume=a;
    duration=d;
    }

    public void CreateSound(string str)
    {

    }

    }
    class Memory
    {
    int counter = 0;
    Sound[] memory= new Sound[10];
    public bool AdTrack(Sound ob)
    {
    if (memory.Length <= counter) return false;
    memory[counter] = ob;
    counter++;
    return true;
    }
    }

    class MainClass
    {

    static void Main()
    {
    WellMessage hi = new WellMessage();
    for(int i=0 ; i==WellMessage.getWell(hi).Length ; i++)
    {
    Console.WriteLine(WellMessage.getWell(hi));
    Console.WriteLine("ho");
    }

    }

    public string GetStr(string wellCom)
    {
    Console.WriteLine(wellCom);
    return(Console.ReadLine()) ;
    }
    public int GetNum(string wellCom)
    {
    Console.WriteLine(wellCom);
    return(Convert.ToInt32(Console.ReadLine())) ;
    }
    }
    class WellMessage
    {
    //instance var
    string[] wellM ={"welocme to my program"
    ,"thats just for practice"
    ,"chose your choice:"
    ,"1.Add new track"
    ,"2.Add new albume"
    ,"3.delete any albume or track"
    ,"4.exite"
    };
    public static string[] getWell(WellMessage ob)
    {
    string[] hello = ob.wellM ;
    return hello;
    }
    }



دیدگاه خود را بنویسید





نشانی ایمیل شما منتشر نخواهد شد.

کامنت های شما بعد از تأیید توسط نویسنده وبلاگ، منتشر خواهند شد.

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

شما میتوانید با مراجعه به سایت گراواتار یک آواتار اختصاصی برای خود تعریف کنید، تا در کنار نام شما نمایش داده شود

برای قرار دادن کدهای نمونه می توانید از تگ های [php] ، [html] ، [css] و [js] استفاده کنید.
به عنوان مثال کدهای php را می توان به صورت زیر قرار داد:
[php] var $whoLoveIranians = "WebTarget!"; [/php]



کلیه حقوق مادی و معنوی برای وب سایت وب تارگت محفوظ است ©2017 وب‌تارگت

استفاده از مطالب وب سایت در سایر وب سایت‌ها و نشریات چاپی با ذکر منبع آزاد است.