PDA

View Full Version : سوال: سوال در مورد برنامه نویسی شی گرا



oliya24
پنج شنبه 30 خرداد 1392, 19:47 عصر
سلام دوستان خسته نباشید بنده چند روزی هست که دارم زبان سی شارپ رو فرا میگیرم حالا یه سری سوال در مورد کلاس و کلاس نویسی داشتم
1: property ها برای چی هستند؟؟؟؟ و در چه شرایطی در یک کلاس باید property تعریف کرد؟
2: ایا میشه که یک کلاس اصلا property نداشته باشد؟
3:در مورد برنامه نویسی شی گرا شما دوستان پیشنهاد میکنید بنده چه بخشهایی از کلاس نویسی رو یاد بگیرم؟؟؟

میلاد رئیسی
پنج شنبه 30 خرداد 1392, 19:51 عصر
Property ها امكان ايجاد حفاظت از فيلدهاي يك كلاس را از طريق خواندن و نوشتن بوسيله Property را فراهم مي‌نمايد. Property ها علاوه بر اينكه از فيلدهاي يك كلاس حفاظت مي‌كنند، همانند يك فيلد قابل دسترسي هستند. بمنظور درك ارزش Property ها بهتر است ابتدا به روش كلاسيك كپسوله كردن متدها توجه نماييد.

مثال 1: يك نمونه از چگونگي دسترسي به فيلدهاي كلاس به طريقه كلاسيك

using System;
public class PropertyHolder
{
private int someProperty = 0;
public int getSomeProperty()
{
return someProperty;
}
public void setSomeProperty(int propValue)
{
someProperty = propValue;
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder();
propHold.setSomeProperty(5);
Console.WriteLine("Property Value: {0}", propHold.getSomeProperty());
return 0;
}
}
مثال 1 روش كلاسيك دسترسي به فيلدهاي يك كلاس را نشان مي‌دهد. كلاس PropertyHolder داراي فيلدي است تمايل داريم به آن دسترسي داشته باشيم. اين كلاس داراي دو متد getSomeProperty() و setSomePropery() مي‌باشد. متد getSomeProperty() مقدار فيلد someProperty را باز مي‌گرداند و متد setSomeProperty() مقداري را به فيلد someProperty تخصيص مي‌دهد.

كلاس PropertyTester از متدهاي كلاس PropertyHolder جهت دريافت مقدار فيلد someProperty از كلاس PropertyHolder استفاده مي‌كند. در متد Main() نمونه جديدي از شي PropertyHolder با نام propHold ايجاد مي‌گردد. سپس بوسيله متد setSomeProperty، مقدار someMethod از propHold برابر با 5 مي‌گردد و سپس برنامه مقدار property را با استفاده از فراخواني متد Console.WriteLine() در خروجي نمايش مي‌دهد. آرگومان مورد استفاده براي بدست آوردن مقدار property فراخواني به متد getSomeProperty() است كه توسط آن عبارت “Property Value : 5” در خروجي نمايش داده مي‌شود.

چنين متد دسترسي به اطلاعات فيلد بسيار خوب است چرا كه از نظريه كپسوله كردن شيء‌گرايي پشتيباني مي‌كند. اگر پياده‌سازي someProperty نيز تغيير يابد و مثلا از حالت int به byte تغيير يابد، باز هم اين متد كار خواهد كرد. حال همين مسئله با استفاده از خواص Property ها بسيار ساده‌تر پياده‌سازي مي‌گردد. به مثال زير توجه نماييد.

مثال 2: دسترسي به فيلدهاي كلاس به استفاده از Property ها

using System;
public class PropertyHolder
{
private int someProperty = 0;
public int SomeProperty
{
get
{
return someProperty;
}
set
{
someProperty = value;
}
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder();
propHold.SomeProperty = 5;
Console.WriteLine("Property Value: {0}", propHold.SomeProperty);
return 0;
}
}


مثال 2 چگونگي ايجاد و استفاده از ويژگيها (Property) را نشان مي‌دهد. كلاس PropertyHolder داراي پياده‌سازي از ويژگي SomeProperty است. توجه نماييد كه اوليد حرف از نام ويژگي با حرف بزرگ نوشته شده و اين تنها تفاوت ميان اسم ويژگي SomeProperty و فيلد someProperty مي‌باشد. ويژگي داراي دو accessor با نامهاي set و get است. accessor get مقدار فيلد someProperty را باز مي‌گرداند. set accessor نيز با استفاده از مقدار value، مقداري را به someProperty تخصيص مي‌دهد. كلمه value كه در set accessor آورده شده است جزو كلمات رزرو شده زبان C#‎‎‎‎‎ مي‌باشد.

كلاس PropertyTester از ويژگي someProperty مربوط به كلاس PropertyHolder استفاده مي‌كند. اولين خط در متد Main() شي‌اي از نوع PropertyHolder با نام propHold ايجاد مي‌نمايد. سپس مقدار فيلد someProperty مربوط به شيء propHold، با استفاده از ويژگي SomeProperty به 5 تغيير مي‌يابد و ملاحظه مي‌نماييد كه مسئله به همين سادگي است و تنها كافي است تا مقدار مورد نظر را به ويژگي تخصيص دهيم.

پس از آن، متد Console.WriteLine() مقدار فيلد someProperty شيء propHold را چاپ مي‌نمايد. اين عمل با استفاده از ويژگي SomeProperty شيء propHold صورت مي‌گيرد.

ويژگيها را مي‌توان طوري ايجاد نمود كه فقط خواندني (Read-Only) باشند. براي اين منظور تنها كافيست تا در ويژگي فقط از get accessor استفاده نماييم. به مثال زير توجه نماييد.

ويژگيهاي فقط خواندني (Read-Only Properties)
مثال 3: ويژگيهاي فقط خواندني

using System;
public class PropertyHolder
{
private int someProperty = 0;
public PropertyHolder(int propVal)
{
someProperty = propVal;
}
public int SomeProperty
{
get
{
return someProperty;
}
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder(5);
Console.WriteLine("Property Value: {0}", propHold.SomeProperty);
return 0;
}
}


مثال 3 چگونگي ايجاد يك ويژگي فقط خواندني را نشان مي‌دهد. كلاس PropertyHolder داراي ويژگي SomeProperty است كه فقط get accessor را پياده‌سازي مي‌كند. اين كلاس PropertyHolder داراي سازنده‌ايست كه پارامتري از نوع int دريافت مي‌نمايد.

متد Main() از كلاس PropertyTester شيء جديدي از PropertyHolder با نام propHold ايجاد مي‌نمايد. اين نمونه از كلاس PropertyHolder از سازندة آن كه مقداري صحيح را بعنوان پارامتر دريافت مي‌كند، استفاده مي‌كند. در اين مثال اين مقدار برابر با 5 در نظر گرفته مي‌شود. اين امر باعث تخصيص داده شدن عدد 5 به فيلد someProperty از شيء propHold مي‌شود.

تا زمانيكه ويژگي SomeProperty از كلاس PropertyHolder فقط خواندني است، هيچ راهي براي تغيير مقدار فيلد someProperty وجود ندارد. بعنوان مثال در صورتيكه عبارت propHold.SomeProperty = 7 را در كد برنامه اضافه نماييد، برنامة شما كامپايل نخواهد شد چراكه ويژگي SomeProperty فقط خواندني است. اما اگر از اين ويژگي در متد Console.WriteLine() استفاده نماييد بخوبي كار خواهد كرد زيرا اين دستور تنها يك فرآيند خواندن است و با استفاده از get accessor اين عمل قابل اجرا است.

ويژگيهاي فقط نوشتني (Write-Only Properties)
به مثال زير توجه فرماييد :

مثال 4 : ويژگيهاي فقط خواندني

using System;
public class PropertyHolder
{
private int someProperty = 0;
public int SomeProperty
{
set
{
someProperty = value;
Console.WriteLine("someProperty is equal to {0}", someProperty);
}
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder();
propHold.SomeProperty = 5;
return 0;
}
}


مثال 4 چگونگي ايجاد و استفاده از ويژگي فقط نوشتني را نشان مي‌دهد. در اين حالت get accessor را از ويژگي SomeProperty حذف كرده و به جاي آن set accessor را قرار داده‌ايم.

متد Main() كلاس PropertyTester شي‌اي جديد از همين كلاس با سازندة پيش فرض آن ايجاد مي‌نمايد. سپس با استفاده از ويژگي SomeProperty از شيء propHold، مقدار 5 را به فيلد someProperty مربوط به شيء propHold تخصيص مي‌دهد. در اين حالت set accessor مربوط به ويژگي SomeProperty فراخواني شده و مقدار 5 را به فيلد someProperty تخصيص مي‌دهد و سپس عبارت someProperty is equal to 5” “را در خروجي نمايش مي‌دهد.


دوست عزیز پیشنهاد میکنم همه مباحث شی گرا رو کامل یاد بگیرید ! کتاب زیاد در این زمینه هست !