البنية الأساسية للبرمجة كائنية التوجه في C# هي الصنف، وهو مزيج من البيانات (الحقول) والسلوك (الطُرق). تُعرف حقول الصنف وطُرقه باسم أعضائه.
يمكن تقييد الوصول إلى الأعضاء عبر محدّدات الوصول، وأكثرها شيوعًا اثنان:
public: يمكن لأي كود الوصول إلى العضو (دون قيود).private: لا يمكن الوصول إلى العضو إلا من كود داخل الصنف نفسه.يمكنك أن تتخيل الصنف كقالب لإنشاء نسخ منه. ولإنشاء نسخة من صنف (وتُعرف أيضًا باسم كائن)، تُستخدم الكلمة المفتاحية new:
class Car
{
}
// Create two car instances
var myCar = new Car();
var yourCar = new Car();
للحقول نوع، ويمكن تعريفها في أي مكان داخل الصنف.
تُعرّف الحقول العامة بترميز PascalCase، أما الحقول الخاصة فتُعرّف بترميز camelCase مع بادئة شرطة سفلية _:
class Car
{
// Accessible by anyone
public int Weight;
// Only accessible by code in this class
private string _color;
}
يمكنك اختياريًا إسناد قيمة ابتدائية إلى الحقل. وإذا لم يحدّد الحقل قيمة ابتدائية، فسيُضبط على القيمة الافتراضية لنوعه. ويمكن الوصول إلى قيم حقول النسخة وتحديثها باستخدام الترميز النقطي.
class Car
{
// Will be set to specified value
public int Weight = 2500;
// Will be set to default value (0)
public int Year;
}
var newCar = new Car();
newCar.Weight; // => 2500
newCar.Year; // => 0
// Update value of the field
newCar.Year = 2018;
عادةً ما تُحدَّث الحقول الخاصة كأثر جانبي لاستدعاء إحدى الطُرق. وعادةً لا تُرجع هذه الطُرق أي قيمة، وفي هذه الحالة يجب أن يكون نوع الإرجاع void:
class CarImporter
{
private int _carsImported;
public void ImportCars(int numberOfCars)
{
// Update private field from public method
_carsImported = _carsImported + numberOfCars;
}
}
في هذا التمرين ستتلاعب بسيارة تحكّم عن بُعد، وقد ادّخرت أخيرًا ما يكفي من المال لشرائها.
تبدأ السيارات ببطارية ممتلئة (100%). في كل مرة تقود فيها السيارة باستخدام جهاز التحكم عن بُعد، تقطع 20 مترًا وتستهلك واحدًا بالمئة من شحن البطارية.
تحتوي سيارة التحكم عن بُعد على شاشة LED أنيقة تعرض معلومتين:
"Driven <METERS> meters"."Battery at <PERCENTAGE>%".إذا وصل شحن البطارية إلى 0%، فلن تستطيع قيادة السيارة بعد ذلك، وستعرض شاشة البطارية "Battery empty".
لديك ست مهام، وستتعامل كل مهمة مع نسخة من سيارة التحكم عن بُعد.
نفّذ طريقة (static) RemoteControlCar.Buy() لتُرجع نسخة جديدة تمامًا من سيارة التحكم عن بُعد:
RemoteControlCar car = RemoteControlCar.Buy();
نفّذ طريقة RemoteControlCar.DistanceDisplay() لتُرجع المسافة كما تظهر على شاشة LED:
var car = RemoteControlCar.Buy();
car.DistanceDisplay();
// => "Driven 0 meters"
نفّذ طريقة RemoteControlCar.BatteryDisplay() لتُرجع نسبة شحن البطارية كما تظهر على شاشة LED:
var car = RemoteControlCar.Buy();
car.BatteryDisplay();
// => "Battery at 100%"
نفّذ طريقة RemoteControlCar.Drive() التي تُحدّث عدد الأمتار المقطوعة:
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
car.DistanceDisplay();
// => "Driven 40 meters"
حدّث طريقة RemoteControlCar.Drive() لتُحدّث نسبة شحن البطارية:
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
car.BatteryDisplay();
// => "Battery at 98%"
حدّث طريقة RemoteControlCar.Drive() بحيث لا تزيد المسافة المقطوعة ولا تنقص نسبة شحن البطارية عندما تكون البطارية فارغة (عند 0%):
var car = RemoteControlCar.Buy();
// Drain the battery
// ...
car.DistanceDisplay();
// => "Driven 2000 meters"
car.BatteryDisplay();
// => "Battery empty"
سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.