|
|
|
|
|
كلاس ها در سي شارپ : تا بحال در حد كاربرد ، با كلاس ها آشنا شده ايم . اما در اين قسمت مي خواهيم نگاهي دقيق تر به كلاس ها بياندازيم. هر كدي در سي شارپ قسمتي از يك كلاس مي باشد و تركيب تمام خواص و متدهاي موجود در يك كلاس يك نوع داده ي جديد تعريف شده از طرف ما را پديد مي آورد. هر متغيري كه از كلاس ساخته شود ، شيء ناميده مي شود و يك كپي منحصر به فرد است. براي مثال برنامه ي زير را درنظر بگيريد : using System; در اينجا كلاس Data تعريف شده است و داراي يك عضو به نام x مي باشد. به اين نوع داده در كلاس فيلد گفته مي شود و هنگاميكه به صورت public معرفي مي شود يعني خارج از كلاس نيز قابل دسترسي است. در كد بالا دو متغير از كلاس تعريف و مقدار دهي اوليه شده اند. خروجي برنامه به صورت زير است : class Data { public int x; } class App { public static void Main() { Data d1 = new Data(); d1.x = 1; Data d2 = new Data(); d2.x = 2; Console.WriteLine("d1.x = {0}", d1.x); Console.WriteLine("d2.x = {0}", d2.x); } } d1.x = 1 دليل اين خروجي آن است كه هر instance (نمونه) از كلاس منحصر بفرد است و در اينجا نمي توان انتظار داشت كه هر دو خروجي يكي شوند. d2.x = 2 براي مقدار دهي اوليه متغيرهايي كه به صورت فيلد تعريف مي شوند ، بهتر است مقدار دهي آنها را در سازنده ي كلاس (constructor) انجام دهيم. class Data همانطور كه پيشتر نيز ذكر شد ، متدي كه هم نام كلاس است ، سازنده نام مي گيرد. يك كلاس مي تواند بيش از يك سازنده داشته باشد. براي مثال : { public int x; public Data(){x = 99;} } class Data از آنجائيكه كه سازنده ي بدون پارامتر ذكر شده در كد فوق private تعريف شده است بنابراين خارج از كلاس ديگر قابل دسترسي نمي باشد . بنابراين كدي خارج از كلاس ، تنها مي تواند از دو سازنده ي ديگر استفاده كند. براي مثال تعريف دو متغير جديد از اين كلاس به صورت زير مي باشد : { public int x; private Data(){} public Data(int y){x = y;} public Data(int y, int z){x = y + z;} } Data d1 = new Data(44); سي شارپ به شما اجازه مي دهد تا سازنده ها را در يك كلاس توسط كلمه ي كليدي this نيز فراخواني كنيد يعني بجاي ذكر نام متد سازنده از كلمه ي this استفاده شود ( در خود كلاس ) . Data d2 = new Data(22, 33); اگر مي خواهيد متغيري را بين نمونه (instance) هاي مختلف يك كلاس به اشتراك بگذاريد كلمه ي كليدي static وارد صحنه مي شود. به مثال زير توجه كنيد : using System; بايد خاطر نشان كرد كه متغيرهاي استاتيك توسط نمونه هاي كلاس قابل دستيابي نيستند و فقط درون كلاس به شكل زير مي توان از آْنها استفاده كرد : class Counted { public static int count = 0; public Counted() { count++; } public int GetInstanceCount() { return count; } } class App { public static void Main() { Counted d1 = new Counted(); Console.WriteLine("current total {0}", d1.GetInstanceCount()); Counted d2 = new Counted(); Console.WriteLine("current total {0}", d2.GetInstanceCount()); Console.WriteLine("total {0}", Counted.count); } } در مثال فوق تابع GetInstanceCount تنها يك عدد را بر مي گرداند. در برنامه نويسي شيء گرا مرسوم است كه در اين حالت به جاي توابع از خواص استفاده شود كه به اندازه ي كافي در مورد آنها در قسمت هاي قبل توضيح داده شد. در اين صورت تعريف فوق به صورت زير در مي آيد : class Counted و در اين صورت قسمت بعدي كد به صورت زير اصلاح مي شود (فراخواني خواص ، بدون ذكر پرانتزها بعد از نام آنها صورت مي گيرد): { public static int x = 0; public Counted() { x++; } public int InstanceCount // property { get{return x;} } } Counted d1 = new Counted(); اگر يك خاصيت هم خواندني و هم نوشتني باشد به صورت زير تعريف مي شود : Console.WriteLine("current total {0}", d1.InstanceCount); Counted d2 = new Counted(); Console.WriteLine("current total {0}", d2.InstanceCount); private string name; فيلدهاي پابليك را مي توان خواند و يا تغيير داد. اگر لازم باشد تا كاربر نتواند آنها را تغيير دهد مي توان از كلمه ي كليدي readonly قبل از تعريف آنها استفاده كرد. مثال : public string Name { get{return name;} set{name = value;} } class Data بحث كلاس ها ادامه دارد...{ public readonly int x = 42; } |
||
|
+
نوشته شده در چهارشنبه 29 شهریور1385ساعت 10:7 توسط لوتوس
|
|
||
|
|
|
|
|
از اين قسمت به بعد مي خواهيم نگاهي دقيق تر به بحث شيء گرايي در سي شارپ بياندازيم؛ همانند فضاهاي نام ، كلاس ها ، ارث بري ، پلي مرفيسم و غيره. در قسمت هاي قبل آشنايي مختصري با فضاهاي نام پيدا كرديم. در ادامه جزئيات بيشتري را در مورد آن بررسي خواهيم كرد. فضاهاي نام (namespaces) براي اداره كردن و نظم بخشيدن به كدها ارائه شده اند. همچنين از امكان تشابه اسمي در بين قسمت هاي مختلف برنامه نيز جلوگيري مي كنند. استفاده از آنها عادت پسنديده اي است هنگاميكه قصد داريم از كد نوشته شده بارها و بارها استفاده كنيم. مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex24 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : // Namespace Declaration توضيحاتي در مورد كد فوق : using System; namespace ex24 { namespace tutorial { // Program start class class NamespaceCSS { // Main begins program execution. public static void Main() { // Write to console Console.WriteLine("This is the new Namespace."); } } } } يكي از روش هاي مناسب براي معرفي فضاهاي نام ، ارائه ي آنها به صورت سلسله مراتبي مي باشد. قسمت هاي عمومي تر در بالا و قسمت هاي اختصاصي تر در فصاهاي نام داخلي تر قرار داده مي شوند. اين روش به معرفي فضاهاي نام تو در تو منتهي مي شود (nested namespaces) ، همانند مثال بالا. كد فوق را به صورت زير با استفاده از عملگر دات (.) مي توان خلاصه نويسي كرد و نتيجه با قبل تفاوتي ندارد: // Namespace Declaration طريقه ي فراخواني اعضاي فضاهاي نام : using System; namespace ex24.tutorial { // Program start class class NamespaceCSS { // Main begins program execution. public static void Main() { // Write to console Console.WriteLine("This is the new Namespace."); } } } مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex25 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : // Namespace Declaration توضيحاتي در مورد كد فوق : using System; namespace ex25 { // nested namespace namespace tutorial { class myExample1 { public static void myPrint1() { Console.WriteLine("calling another namespace member1."); } } } // Program start class class NamespaceCalling { // Main begins program execution. public static void Main() { // Write to console tutorial.myExample1.myPrint1(); tutorial.myExample2.myPrint2(); } } } // same namespace as nested namespace above namespace ex25.tutorial { class myExample2 { public static void myPrint2() { Console.WriteLine("calling another namespace member2."); } } } در كد فوق نحوه ي استفاده از اعضاي تعريف شده در فضاهاي نام را مي توان مشاهده كرد. نحوه ي استفاده از آنها همانطور كه در قسمت هاي قبل نيز گفته شد به صورت زير است : ProjectName.NameSpace.ClassName.MemberName براي مثال در فصاي نام tutorial كلاس myExample1 قرار دارد و داخل آن متد myPrint1 تعريف شده است. پس نحوه ي دسترسي به متد آن به صورت زير است : tutorial.myExample1.myPrint1(); كلاس هاي myExample1 و myExample2 هر دو به يك فضاي نام (ex25.tutorial) تعلق دارند ، هر چند جدا از هم نوشته شده اند. حتي آنها را با حفظ سلسله مراتب خودشان مي توان در فايلهاي جداگانه اي نيز نوشت. استفاده از using : مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex26 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : // Namespace Declaration توضيحاتي در مورد كد فوق : using System; using ex26.tutorial; // Program start class class UsingDirective { // Main begins program execution. public static void Main() { // Call namespace member myExample.myPrint(); } } // C# Namespace namespace ex26.tutorial { class myExample { public static void myPrint() { Console.WriteLine("Example of using a using directive."); } } } همانند مثال بالا ، براي خلاصه نويسي مي توان از كلمه ي using به همراه نام namespace مورد نظر استفاده كرد. براي مثال اگر متد WriteLine را بخواهيم كامل بنويسيم به صورت زير است : System.Console.WriteLine(...); اما با قيد كردن و الحاق كردن فضاي نام آن ، ديگر نيازي به ذكر System در ابتداي آن نيست. نكته : باز هم مي توان خلاصه نويسي بيشتري را ارائه داد using csTut = ex26.tutorial.myExample; // alias در اين صورت تنها كافي است متد كلاس تعريف شده در آنرا به صورت زير فراخواني كنيم : csTut.myPrint(); |
||
|
+
نوشته شده در یکشنبه 5 شهریور1385ساعت 1:34 توسط لوتوس
|
|
||
|
|
|
|
|
Jagged arrays Jagged arrays آرايه اي از آرايه ها است و همانطور كه ذكر شد لزومي ندارد كه هر رديف آن با رديف بعدي هم طول باشد . هنگام تعريف اين نوع آرايه شما تعداد رديف ها را مشخص مي نماييد. هر رديف يك آرايه را نگهداري مي كند. در اينجا هر آرايه بايد تعريف شود. روش تعريف Jagged array به صورت زير است type [] []... در اينجا تعداد براكت ها بيانگر ابعاد آرايه مي باشد. براي مثال آرايه ي زير دو بعدي است : int [] [] myJaggedArray; و براي مثال براي دسترسي به پنجمين عنصر آرايه ي سوم به صورت زير عمل مي شود : myJaggedArray[2][4] مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex21 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System; توضيحاتي در مورد كد فوق : namespace ex21 { class Class1 { [STAThread] static void Main(string[] args) { const int rows = 4; // declare the jagged array as 4 rows high int[][] jaggedArray = new int[rows][]; // the first row has 5 elements jaggedArray[0] = new int[5]; // a row with 2 elements jaggedArray[1] = new int[2]; // a row with 3 elements jaggedArray[2] = new int[3]; // the last row has 5 elements jaggedArray[3] = new int[5]; // Fill some (but not all) elements of the rows jaggedArray[0][3] = 15; jaggedArray[1][1] = 12; jaggedArray[2][1] = 9; jaggedArray[2][2] = 99; jaggedArray[3][0] = 10; jaggedArray[3][1] = 11; jaggedArray[3][2] = 12; jaggedArray[3][3] = 13; jaggedArray[3][4] = 14; for (int i = 0;i < 5; i++) { Console.WriteLine("jaggedArray[0][{0}] = {1}", i,jaggedArray[0][i]); } for (int i = 0;i < 2; i++) { Console.WriteLine("jaggedArray[1][{0}] = {1}", i,jaggedArray[1][i]); } for (int i = 0;i < 3; i++) { Console.WriteLine("jaggedArray[2][{0}] = {1}", i,jaggedArray[2][i]); } for (int i = 0;i < 5; i++) { Console.WriteLine("jaggedArray[3][{0}] = {1}", i,jaggedArray[3][i]); } Console.ReadLine(); } } } هنگام كار با آرايه هاي rectangular براي درسترسي به اعضا به صورت زير عمل مي شد : rectangularArrayrectangularArray[i,j] اما در اينجا بدين صورت است : jaggedArray[3][i] استفاده از System.Array : دات نت فريم ورك كلاسي را معرفي كرده است به نام Array. توسط اين كلاس كار با آرايه ها و اعمال روي آنها براي مثال سورت كردن و غيره به شدت ساده مي شود . مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex22 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System; توضيحاتي در مورد كد فوق : namespace ex22 { class Class1 { public static void PrintMyArray(object[] theArray) { foreach (object obj in theArray) { Console.WriteLine("Value: {0}", obj); } Console.WriteLine("\n"); } [STAThread] static void Main(string[] args) { String[] myArray = { "Who", "is", "John", "Galt" }; PrintMyArray(myArray); Array.Reverse(myArray); PrintMyArray(myArray); String[] myOtherArray = { "We", "Hold", "These", "Truths", "To", "Be", "Self", "Evident" }; PrintMyArray(myOtherArray); Array.Sort(myOtherArray); PrintMyArray(myOtherArray); Console.ReadLine() ; } } } از دو متد Sort و Reverse در اينجا براي سورت كردن و نمايش آرايه به ترتيب معكوس (از انتها به ابتدا) استفاده گرديده است. تعريف آرايه هاي ديناميك در سي شارپ : يكي از مشكلاتي كه با آرايه هاي معمول وجود دارد اين است كه قبل از هر كاري بايد طول آْنها را مشخص كرد. گاهي از اوقات ما دقيقا نمي دانيم برنامه چه تعداد عضو را دريافت مي كند تا آرايه اي از پيش تعريف شده با همان تعداد عضو ايجاد كنيم. براي حل اين مشكل از كلاس ArrayList تعريف شده در دات نت فريم ورك مي توان استفاده كرد. هنگام استفاده از ArrayList نيازي به دانستن تعداد اعضايي كه بايد اضافه شوند نمي باشد و با استفاده از متد Add آن به سادگي مي توان اعضاء را به آن اضافه نمود . تعدادي از خواص و متدهاي اين كلاس به صورت زير هستند : Adapter , FixedSize , ReadOnly , Repeat , Synchronized , Capacity,Count , IsFixedSize , IsReadOnly , IsSynchronized , Item , SyncRoot , Add , AddRange , BinarySearch , Clear , Clone , Contains , CopyTo , GetEnumerator , GetRange , IndexOf , Insert , InsertRange , LastIndexOf , Remove , RemoveAt , RemoveRange , Reverse , SetRange , Sort , ToArray , TrimToSize مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex23 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System; توضيحاتي در مورد كد فوق : using System.Collections; namespace ex23 { // a simple class to store in the array public class Employee { public Employee(int empID) { this.empID = empID; } public override string ToString( ) { return empID.ToString( ); } public int EmpID { get { return empID; } set { empID = value; } } private int empID; } class Class1 { [STAThread] static void Main(string[] args) { ArrayList empArray = new ArrayList( ); ArrayList intArray = new ArrayList( ); // populate the array for (int i = 0;i<5;i++) { empArray.Add(new Employee(i+100)); intArray.Add(i*5); } // print all the contents for (int i = 0;i Console.Write("{0} ", intArray[i].ToString( )); } Console.WriteLine("\n"); // print all the contents of the button array for (int i = 0;i Console.Write("{0} ", empArray[i].ToString( )); } Console.WriteLine("\n"); Console.WriteLine("empArray.Capacity: {0}", empArray.Capacity); Console.ReadLine(); } } } 1- با كلمه ي كليدي override در قسمت هاي بعدي آشنا خواهيم شد. 2- براي استفاده از ArrayList لازم بود تا فضاي نامي را كه اين كلاس در آن تعريف شده است ، به برنامه اضافه كرد. 3- در مثال فوق نحوه ي تعريف دو كلاس را در يك فضاي نام مشاهده مي نماييد. 4- نحوه ي تعريف و مقدار دهي ArrayList و همچنين استفاده از خواص آن در مثال فوق بررسي شده است |
||
|
+
نوشته شده در چهارشنبه 1 شهریور1385ساعت 10:19 توسط لوتوس
|
|
||