ملخص - حاسبة الأشكال
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 30 من 70.
التحدي
سهللنقم ببناء حاسبة أشكال تجمع كل ما تعلمته حول الواجهات (interfaces) وتعدد الأشكال (polymorphism). ستقوم بإنشاء نظام حيث يمكن معالجة الأشكال المختلفة بشكل موحد من خلال واجهة مشتركة، مما يوضح قوة تعدد الأشكال في وقت التشغيل (runtime polymorphism).
ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:
IShape.cs: قم بتعريف واجهة تسمىIShapeداخل مساحة الأسماءShapes. يجب أن يكون كل شكل قادرًا على حساب مساحته ووصف نفسه. قم بالتصريح عن طريقتين (methods):CalculateArea()التي تعيدdouble، وGetDescription()التي تعيدstring.Circle.cs: أنشئ فئةCircleفي مساحة الأسماءShapesتقوم بتنفيذIShape. الدائرة لها خاصيةRadius(double) يتم تعيينها من خلال منشئ الفئة (constructor). صيغة المساحة هيMath.PI * Radius * Radius. يجب أن يعيد الوصف"Circle with radius {Radius}".Rectangle.cs: أنشئ فئةRectangleفي مساحة الأسماءShapesتقوم بتنفيذIShape. المستطيل له خاصيتيWidthوHeight(كلاهما double) يتم تعيينهما من خلال منشئ الفئة. المساحة هي ببساطة العرض مضروبًا في الارتفاع. يجب أن يعيد الوصف"Rectangle {Width}x{Height}".Program.cs: في ملفك الرئيسي، أنشئ دائرة ومستطيلاً باستخدام قيم الإدخال، ثم قم بتخزينهما في مصفوفة من مراجعIShape. قم بالمرور عبر المصفوفة في حلقة تكرارية، ولكل شكل، اطبع وصفه متبوعًا بمساحته مقربة إلى منزلتين عشريتين. يوضح هذا كيف يمكنك معالجة أشكال مختلفة تمامًا من خلال نفس الواجهة!
ستتلقى ثلاثة مدخلات:
- نصف قطر الدائرة (double)
- عرض المستطيل (double)
- ارتفاع المستطيل (double)
اطبع المخرجات بهذا التنسيق لكل شكل:
{GetDescription() result}
Area: {CalculateArea() rounded to 2 decimal places}على سبيل المثال، إذا كانت المدخلات هي 5، 4، و 6، يجب أن تكون المخرجات:
Circle with radius 5
Area: 78.54
Rectangle 4x6
Area: 24.00لاحظ كيف أن حلقة التكرار الخاصة بك لا تحتاج إلى معرفة ما إذا كانت تتعامل مع دائرة أو مستطيل - فهي ببساطة تستدعي طرق الواجهة وتترك تعدد الأشكال يتولى الباقي. هذه هي أناقة البرمجة باستخدام الواجهات!
جرّب بنفسك
using System;
using Shapes;
class Program
{
public static void Main(string[] args)
{
// قراءة قيم المدخلات
double circleRadius = Convert.ToDouble(Console.ReadLine());
double rectWidth = Convert.ToDouble(Console.ReadLine());
double rectHeight = Convert.ToDouble(Console.ReadLine());
// TODO: قم بإنشاء كائن Circle بنصف القطر المعطى
// TODO: قم بإنشاء كائن Rectangle بالعرض والارتفاع المعطيين
// TODO: قم بإنشاء مصفوفة من IShape تحتوي على كلا الشكلين
// TODO: قم بالمرور عبر المصفوفة ولكل شكل:
// - اطبع الوصف باستخدام GetDescription()
// - اطبع "Area: " متبوعاً بـ CalculateArea() مقرباً إلى منزلتين عشريتين
}
}
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection