آموزش سی شارپ – توابع پیشرفته
در بخش قبلی برخی از خواص توابع را مطالعه کردید در این بخش توابع را به صورت پیشرفتهتری برای شما توضیح خواهیم داد.
حتما قبل از بررسی توابع پیشرفته در سی شارپ نوشتهی مطالب قبلی این دورهی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
آموزش سی شارپ توابع پیشرفته
Return کردن object از متد
در برنامهی زیر کلاسی به اسم Person وجود دارد که در این کلاس متدی به اسم ()CreateNewPerson است. یک شیء از جنس Person میسازد و این شیء را return میکند:
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); } } // Using : Person firstPerson = new Person("Catherine", "Gilbert"); Console.Write("Fist Person = "); firstPerson.Show(); Person secondPerson = firstPerson.CreateNewPerson("Damon", "Salvatore"); Console.Write("Second Person = "); secondPerson.Show();
Return کردن یک آرایه
گاهی شما از یک متد وظیفهی بازگشت آرایه را دارید. در مثال زیر متد GetFriends() در کلاس Person انجام خواهد شد:
class Person { string Name, Family; string[] Friends; public string[] GetFriends() { return Friends; } public Person(string name, string family) { Name = name; Family = family; } 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]; } } // Using : 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] + ", "); }
معرفی Method Overloading
مفهوم Method Overloading در واقع به این معناست که چند متد میتوانند نام یکسانی پیدا کنند، بهشرطی که تعریف و یا تعداد پارامترهای آنها متفاوت شود؛ در این موارد گفته میشود که متدها overload شدهاند و در کل به این پروسه method overloading گفته میشود. یکی از جنبههای اجرای polymorphism (چند ریختی) است.
static void MethodA() { } static void MethodA(string a) { } static int MethodA(double a, int b ) { } // Using : MethodA(); MethodA(""); MethodA(5.25,10);
مثال:
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; } }
در بالا ما چندین ورژن از متد ()Addition را داریم که هر کدام از نظر نوع و تعداد پارامترها با بقیه متفاوت است. همچنین return-type آنها هم میتواند متفاوت شود. توجه کنید که overload کردن به شکل زیر کاملاً نادرست است زیرا تعداد و نوع پارامترهای متناظر یکی است:
public void OvlDemo(int a) { Console.WriteLine("One parameter: " + a); } public int OvlDemo(int a) { Console.WriteLine("One parameter: " + a); return a * a; }
مفهوم Overload Constructors
خاصیت Overload Constructors در زبان برنامه نویسی سی شارپ باعث میشود بتوانید به طریق مختلفی objectهای خود را بسازید.
به مثال زیر توجه کنید:
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; } } // Using : MyClass t1 = new MyClass(); MyClass t2 = new MyClass(88); MyClass t3 = new MyClass(17.23); MyClass t4 = new MyClass(2, 4);
overload کردن constructorهای کلاس، این امکان را میدهد که objectها به طریق مختلفی بتوانند ساخته شوند.
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; } } // Using : 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);
درخواست یک 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 اولیه) بود، اجرا میشود.
به مثال زیر توجه کنید:
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 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; } } // Using : 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 کد تکراری بنویسید.
مثال:
class Mouse { public Mouse(): this(-1, "") { } public Mouse(int weight, string name) { Console.WriteLine("Constructor weight = {0}, name = {1}", weight, name); } } // Using : // Test the two constructors for Mouse type. Mouse mouse1 = new Mouse(); Mouse mouse2 = new Mouse(10, "Sam");
استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسهی بعدی دوره آموزشی سی شارپ بمانید.
ارسال پاسخ