شی گرایی پیشرفته سی شارپ
در جلسه ی قبل با مبحث شی گرایی در کنار شما بودیم و در این قسمت با بررسی مبحث List های داده ای و تکمیل کردن مبحث شی گرایی در کنار شما هستیم.
حتما قبل از بررسی برنامه نویسی شی گرایی پیشرفته در سی شارپ نوشته ی مطالب قبلی این دوره ی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
معرفی Listها :
در صورتی که بخواهید یک تعداد داده به طور متوالی داشته باشید اکثر به دنبال آرایه می روید؛
همانطور که می دانید تعداد سلول های آرایه ثابت است و امکان تغییر تعداد سلول ها یک آرایه بهصورت پویا وجو ندارد.
اما تعداد عناصر List بهصورت پویا میتواند تغییر کند. با استفاده از List نیازی نیست که اندازهی آن را ابتدای کار مشخص شود.
در واقع با استفاده از List آرایهای میسازیم که اندازهی آن ثابت نیست.
List در فضای نام using System.Collections.Generic قرار دارد .
فرم کلی آن به شکل زیر است :
List <Datatype> ListName = new List <Datatype>();
مثال :
List <int> list = new List <int>(); list.Add(52); list.Add(124); list.Add(5); list.Add(19); list.Add(85);
مثال کاربردی :
class Car { public string Color; public string Model; public int MaxSpeed; public Car(string carColor, string carModel, int carMaxSpeed) { Color = carColor; Model = carModel; MaxSpeed = carMaxSpeed; } } // Using : List<Car> CarCollection = new List<Car>(); CarCollection.Add(new Car (“Red", "BMW", 200)); CarCollection.Add(new Car (“Blue", "Benz", 250); CarCollection.Add(new Car (“White", “Toyota", 180)); string NamColor = CarCollection[0].Color; string NamModel = CarCollection[0].Model; int MaxSpeed = CarCollection[0].MaxSpeed;
مبحث Collectionها :
با کمک collectionها می توانیم کلکسیونی از کلاس ها را ایجاد کنیم.
به عنوان مثال می توان کلاسی ایجاد کرد که آن خوداز چندین نمونه ، از کلاس های ایجاد شده باشد.
این کلاس خصوصیاتی مانند حذف و اضافه نمونه ها از کلکسیون را دارا می باشد.
Collection در فضای نام using System.Collections قرار دارد.
هنگام تغریف Collection باید از کلمه CollectionBase در مقابل نام Collection استفاده کنیم (باید از CollectionBase ارثبری کنیم) .
مثال :
public class Car { public string Color; public string Model; public int MaxSpeed; public Car(string carColor, string carModel, int carMaxSpeed) { Color = carColor; Model = carModel; MaxSpeed = carMaxSpeed; } } public class My_cars : CollectionBase { public void Add(Car new_car) { List.Add(new_car); } public void Remove(Car old_car) { List.Remove(old_car); } } public class Car { public string Color; public string Model; public int MaxSpeed; public Car(string carColor, string carModel, int carMaxSpeed) { Color = carColor; Model = carModel; MaxSpeed = carMaxSpeed; } } public class My_cars : CollectionBase { public void Add(Car new_car) { List.Add(new_car); } public void Remove(Car old_car) { List.Remove(old_car); } }
در مثال بالا دو کلاس تعریف شده است.
اولین کلاس، کلاس Car است که ویژگی های یک عنصر از کلکسیون کلاس ما می باشد.
دومین کلاس، کلکسیون کلاس است (My_cars) که شامل مجموعه ای از اشیاء از نوع کلاس Car است.
کلاس CollectionBase دارای خاصیت List است که مجموعه ای از اشیاء را در خود جای می دهد.
همچنین دارای متدهایی مانند Add و Remove و… برای حذف یا اضافه کردن و … اشیاء است و به سادگی می توان با استفاده از خاصیت List و متد مربوطه عملیلات مورد نظر را انجام داد.
نیازی به تعریف یک لیست از نوع کلاس نمی باشد زیرا خود داری خاصیت List می باشد.
نکته :
متدهای خاصیت List یک شیء را قبول می کنند نه یک کلاس را.
نحوه استفاده :
My_cars mycar = new My_cars(); mycar.Add(new Car("Red", "BMW", 200)); mycar.Add(new Car("Blue", "Benz", 250));
کاربرد کلمه ی کلیدی static :
عضوی از کلاس که بدون ساخت هیچ شیءای ، مستقیماً (از طریق نام کلاس و عملگر نقطه)میتوانید به آن دسترسی داشته باشید.
آن عضو بدون ساخت هیچ object ای از کلاس قابل دسترسی و در واقع مستقل از اشیاء است؛
میتوانید هم متدها و هم متغیرها را بهصورت static تعریف کنید.
از آنجا که متد ()Main نقطهی شروع برنامه و یکی از اعضای کلاس است.
باید قبل از هرچیز و پیش از ساخت هرگونه شیءای، صدا زده شود.
لذا متد ()Main را بهصورت static تعریف میکنیم .
class MyClass { public static int Variable = 100; public static int MyMethod() { return Variable + 20; } } MyClass.Variable = 8; MyClass.MyMethod();
نکته :متد static تنها میتواند به اعضای static دسترسی داشته باشد و نمیتواند مستقیماً به اعضای عادی کلاس دسترسی پیدا کند.
زیرا اعضای عادی یک کلاس حتماً باید به یک شیء وصل شوند تا مقدارشان در آن شیء ذخیره شود؛
اگر قصد دارید درون یک متد static به اعضای عادی نیز دسترسی داشته باشید.
باید از طریق یک شیء اینکار را انجام دهید:
class MyClass { public void NonStaticMethod() { Console.WriteLine("This is a non static method"); } public static void StaticMethod(MyClass Mclas) { Mclas.NonStaticMethod(); // this is ok } }
کلاس هایی از نوع static :
هنگامیکه یک کلاس را بهصورت static تعریف میکنید دیگر نمیتوانید از روی این کلاس شیء بسازید و همهی اعضای کلاس باید static باشند .
static class Calculator { public static double Add(double a, double b) { return a + b; } public static double Subtract(double a, double b) { return a - b; } }
برای استفاده از کلاس بالا نیازی ندارید که از آن شیء بسازید و با استفاده از نام خود کلاس می توانید از آن استفاده کنید .
مثال :
class Amplifier { private string Name; private string Model; private int Watt; private int Multichannel; private int EffectivePower; public Amplifier(string name, string model, int watt, int multichannel) { Name = name; Model = model; Multichannel = multichannel; Watt = watt; EffectivePower = watt * multichannel; } public int GetEffectivePower() { return EffectivePower; } public string GetNameAndModel() { return Name + " " + Model; } public int GetMultichannel() { return Multichannel; } } // Using : Amplifier Kenwood = new Amplifier("KENWOOD", "RA-5000", 120, 5, true, 50); Console.WriteLine("Name & Model:" + Kenwood.GetNameAndModel()); Console.WriteLine("Effictive Power:"+ Kenwood.GetEffectivePower()); Console.WriteLine("Multichannel:" + Kenwood.GetMultichannel()); Console.WriteLine("3D Surround Sound: " + Kenwood.GetThreeDSurroundSound());
ابتدا یک شیء از این کلاس ساخته و مقادیر را به آن میدهیم.
فیلدهای private خارج از کلاس خودشان در دسترس نیستند.
ما از طریق یک متد public توانستیم مقدار آنها را به خارج از کلاس ارسال کنیم.
خب بعد از پایان این بحث های پیش نیاز به ادامه ی بحث شی گرایی که در جلسه قبل به آن پرداختیم می پردازیم .
کپسوله سازی یا Encapsulation :
Encapsulation در سیشارپ بدین معناست که اطلاعات یک کلاس در برابر دسترسیهای غیرمجاز و خرابکاری محفوظ نگه داشته شود.
این ویژگی اساسی شی گرایی حاوی دو مزیت اصلی می باشد :
اینکه دادهها را به کدهای درون کلاس متصل میکند.
اینکه دسترسی به اعضای کلاس را کنترل میکند.
کنترل دسترسی از طریق access modifier ها انجام میشود که public، private، protected و internal هستند.
فرستادن Reference به متدها :
پارامترهای ورودی همیشه حتما نباید متغیرها و داده های ساده باشد گاهی نیاز داریم.
به متد Reference خاصی ارسال کنیم و در آن از آن Reference استفاده کنیم.
مثال :
class MyClass { string Name; string Surname; int Age; public MyClass(string name, string surname, int age) { Name = name; Surname = surname; Age = age; } public bool SameAs(MyClass ob) { if (Name == ob.Name && Surname == ob.Surname && Age == ob.Age) return true; else return false; } public void Copy(MyClass ob) { Name = ob.Name; Surname = ob.Surname; Age = ob.Age; } public void Show() { Console.WriteLine(" Name: {0}, Surname: {1}, Age: {2}", Name, Surname, Age); } } // Using : MyClass ob1 = new MyClass("Damon", "Salvatore", 22); MyClass ob2 = new MyClass("Stefan", "Salvatore", 21); Console.WriteLine("ob1: "); ob1.Show(); console.WriteLine("ob2: "); ob2.Show(); if (ob1.SameAs(ob2)) Console.WriteLine("ob1 and ob2 have the same values."); else Console.WriteLine("ob1 and ob2 have different values."); // Now, make ob1 a copy of ob2 ob1.Copy(ob2); Console.WriteLine(); Console.WriteLine("ob1 after copy: "); ob1.Show(); if (ob1.SameAs(ob2)) Console.WriteLine("ob1 and ob2 have the same values."); else Console.WriteLine("ob1 and ob2 have different values.");
نکته :
به همان روشی که value type ها به متدها داده میشوند، reference type ها نیز به متدها داده شدهاند.
ارسال آرگومان به پارامتر ها :
از دو طریق Argument ها به parameter ها فرستاده میشوند:
- Call-by-value
- Call-by-reference
در روش اول call-by-value از مقدار argument یک کپی گرفته شده و به پارامتر داده میشود.
از اینرو، هر کاری که با پارامتر کنید هیچ تغییری روی argument صورت نمیگیرد.
مثال :
static void Change(int x) { x++; } int a = 5; Change(a);
در روش دوم call-by-reference یک reference بهعنوان argument به متد داده شده و کپی این reference به پارامتر فرستاده میشود.
درون متد، پارامتر به همان شیءای رجوع میکند که argument رجوع میکند.
این یعنی اگر هر تغییری روی پارامتر انجام دهید، این تغییر روی argument نیز تاثیر میگذارد زیرا هردو به یک شیء وصل هستند.
تغییر هرکدام، شیء را تحت تاثیر قرار میدهد.
مثال :
class Test { public int a, b; public Test(int i, int j) { a = i; b = j; } public void Change(Test ob) { ob.a = ob.a + ob.b; ob.b = -ob.b; } } // Using : Test ob = new Test(15, 20); Console.WriteLine("ob.a and ob.b before call: " + ob.a + " " + ob.b); ob.Change(ob); Console.WriteLine("ob.a and ob.b after call: " + ob.a + " " + ob.b);
خب این هم از جلسه ای جدید در دوره ی آموزشی سی شارپ امیدوارم لذت برده باشید.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسه ی بعدی دوره آموزشی سی شارپ باشید.
موفق و پیروز باشید.
ارسال پاسخ