يفتقر Rust إلى الدعم المحلي لـ OOP ولكن يمكنك استخدام هذه التقنيات للاستفادة من النموذج على أي حال.
تعمل البرمجة الشيئية (OOP) على تبسيط تصميم البرامج من خلال التأكيد على استخدام الكائنات لتمثيل كيانات ومفاهيم العالم الحقيقي. يشجع OOP قابلية الصيانة من خلال تغليف الوظائف داخل الكائنات.
Rust هي لغة مرنة تدعم البرمجة الوظيفية والإجرائية. على الرغم من أنه لا يدعم البرمجة الموجهة للكائنات أصلاً ، يمكنك تنفيذ مفاهيم OOP باستخدام أنواع البيانات المضمنة في Rust.
تغليف في الصدأ
يستلزم التغليف تنظيم الكود في وحدات قائمة بذاتها تخفي التفاصيل الداخلية أثناء كشف واجهة عامة للتفاعل الخارجي لتقليل التعقيد وتحسين الكود قابلية الصيانة.
يمكنك تغليف كود Rust بوحدات. الوحدة النمطية هي مجموعة من العناصر بما في ذلك الوظائف والتركيبات والتعداد والثوابت. توفر وحدات Rust وظائف لتجميع وتحديد الحدود بين أجزاء البرنامج.
استخدام الوحدات النمطية لتغليف البيانات والوظائف
يمكنك تحديد وحدة باستخدام امتداد عصري كلمة رئيسية متبوعة باسم:
عصري my_module {
// عناصر الوحدة تذهب هنا
}
يمكنك تنظيم الوحدات النمطية بشكل هرمي عن طريق تداخل إعلاناتها:
عصري وحدة الوالدين {
عصري my_module {
// عناصر الوحدة تذهب هنا
}
}
يمكنك بعد ذلك الرجوع إلى الوحدات النمطية المتداخلة بالتسلسل الهرمي الكامل ، مع فصل كل وحدة بنقطتين مزدوجتين ، على سبيل المثال ، parent_module:: my_module.
بشكل افتراضي ، تكون العناصر الموجودة داخل الوحدات النمطية خاصة ولا يمكن الوصول إليها إلا من خلال التعليمات البرمجية الموجودة داخل الوحدة النمطية نفسها. ولكن يمكنك جعل الوحدات النمطية عامة باستخدام امتداد حانة الكلمة الأساسية:
عصري my_module {
حانةالجبهة الوطنيةوظيفتي() {
// وظيفة الجسم هنا
}
}
يمكنك بعد ذلك الوصول إلى ملفات وظيفتي من أجزاء أخرى من برنامجك.
استخدام السمات لتحديد السلوكيات
هناك طريقة أخرى يمكّنها Rust من التغليف وهي من خلال استخدام السمات. تحدد السمات السلوكيات التي يمكن للأنواع تنفيذها وتضمن أن الأنواع المختلفة تتوافق مع نفس الواجهة.
حانةسمةللطباعة {
الجبهة الوطنيةمطبعة(&الذات);
}حانةهيكلنوعي {
// هيكلة الحقول هنا
}
ضمني للطباعة ل نوعي {
الجبهة الوطنيةمطبعة(&الذات) {
// التنفيذ هنا
}
}
ال للطباعة السمة لها مطبعة الطريقة و نوعي الهيكل ينفذ للطباعة سمة من خلال تنفيذ مطبعة طريقة.
باستخدام السمات ، يمكنك التأكد من أن أي نوع يقوم بتنفيذ الامتداد للطباعة السمة لها مطبعة طريقة. يكون هذا مفيدًا عند العمل باستخدام رمز عام يحتاج إلى التعامل مع أنواع مختلفة تشترك في سلوك مشترك.
الميراث في الصدأ
يتيح لك الوراثة تحديد فئة واحدة بناءً على فئة مختلفة. سترث الفئة الفرعية خصائص وطرق أصلها.
في Rust ، نشجعك على استخدام المقطوعات الموسيقية بدلاً من الميراث. التركيب هو عملية إنشاء كائنات جديدة من خلال الجمع بين العناصر الموجودة. بدلاً من إنشاء فئة جديدة ترث الوظائف من الفئة الأساسية ، يمكنك إنشاء بنية جديدة تحتوي على مثيل للبنية الأساسية وحقولها.
تكوين أنواع جديدة من خلال الجمع بين الأنواع الموجودة
ستستخدم التعدادات والبنيات لإنشاء أنواع جديدة. تعد Enums مفيدة للأنواع ذات القيم المحدودة ، ويمكن للبنى أن تحتوي على حقول متعددة.
يمكنك إنشاء نوع تعداد لأنواع مختلفة من الحيوانات.
تعدادحيوان {
قطة،
كلب،
طائر،
// ...
}
بدلاً من ذلك ، يمكنك إنشاء بنية تحتوي على حقول لكل نوع حيوان. يمكن أن تحتوي الهياكل على تعداد وأنواع أخرى.
هيكلحيوان {
اسم: خيط,
عمر: u8,
animal_type: نوع الحيوان ،
}
تعدادنوع الحيوان {
قطة،
كلب،
طائر،
// ...
}
ال حيوان هيكل يحمل قيم نوع الحيوان نوع العد.
يمكنك استخدام السمات لتنفيذ الوراثة وإضافة سلوك إلى نوع دون إنشاء نوع جديد.
سمةيطير {
الجبهة الوطنيةيطير(&الذات);
}
إليك كيف يمكنك تنفيذ يطير سمة لأنواع متعددة.
هيكلطائر {
اسم: خيط,
جناحيها: f32,
}ضمني يطير ل طائر {
الجبهة الوطنيةيطير(&الذات) {
println!("{} انه يطير!", الذات.اسم)؛
}
}هيكلطائرة {
نموذج: خيط,
السرعة القصوى: u32,
}
ضمني يطير ل طائرة {
الجبهة الوطنيةيطير(&الذات) {
println!("{} انه يطير!", الذات.نموذج)؛
}
}
ال طائر و طائرة الهياكل تنفيذ يطير سمة وطباعة السلاسل مع برنتلن! دقيق.
يمكنك استدعاء يطير طريقة على كلا الهيكلين دون معرفة أنواع محددة.
الجبهة الوطنيةرئيسي() {
يترك طائر = طائر {
اسم: خيط::من("نسر"),
جناحيها: 2.0,
};يترك الطائرة = الطائرة {
نموذج: خيط::من("بوينغ 747"),
السرعة القصوى: 900,
};يترك كائنات_طيران: Vecدين يطير> = vec![& طائر ، & طائرة] ؛
ل هدف في كائنات_طائرة {
object.fly () ؛
}
}
ال رئيسي تعمل الوظيفة على إنشاء ملف طائرة و طائر أنواع. ال كائنات_طائرة المتجه هو متجه لمثيلات الكائن ، و ل تتجاوز الحلقة المتجهية وتستدعي يطير طريقة على الحالات.
تنفيذ تعدد الأشكال في الصدأ
فئة أو نوع متعدد الأشكال إذا كانت الأنواع المتعددة تمثل واجهة. نظرًا لأن السمات توفر وظيفة لتحديد السلوكيات في Rust ، مع توفير واجهة مشتركة لكتابة رمز عام ، يمكنك استخدام السمات لتنفيذ تعدد الأشكال.
هذه صفة مسماة قابل للرسم يحدد سلوك عرض الكائنات على الشاشة:
سمةقابل للرسم {
الجبهة الوطنيةيرسم(&الذات);
}
يمكن للأنواع التي تنفذ السمة القابلة للرسم الوصول إلى يرسم وظيفة.
هيكلمستطيل {
عرض: u32,
ارتفاع: u32,
}
ضمني قابل للرسم ل مستطيل {
الجبهة الوطنيةيرسم(&الذات) {
// تقديم المستطيل على الشاشة
}
}
يمكنك كتابة التعليمات البرمجية العامة التي ترسم الكائنات التي تقوم بتنفيذ الامتداد قابل للرسم سمة.
الجبهة الوطنيةرسم_جسم(الكائن: & T) {
object.draw () ؛
}
ال رسم_جسم تأخذ الوظيفة نوعًا عامًا تي
كمدخلات تنفذ قابل للرسم سمة ويدعو يرسم طريقة على السمة. كائنات مختلفة يمكن أن تنفذ قابل للرسم السمة والوصول إلى الوظيفة.
تنفيذ التجريد في الصدأ
التجريد هو مفهوم OOP حيث يمكن الوصول إلى الفئات والواجهات لكائنات وأنواع محددة. يمكنك تنفيذ التجريد في Rust بسمات.
إليك مثال على سمة لمشغل الوسائط:
سمةوسائط {
الجبهة الوطنيةيلعب(&الذات);
}
الهياكل والتعدادات التي تنفذ وسائط يجب أن توفر السمة تطبيقًا لـ يلعب طريقة.
هيكلأغنية {
عنوان: خيط,
فنان: خيط,
}
ضمني وسائط ل أغنية {
الجبهة الوطنيةيلعب(&الذات) {
println!("تشغيل أغنية: {} بواسطة {}", الذات.عنوان، الذات.artist) ؛
}
}
ال أغنية الهيكل ينفذ وسائط سمة من خلال توفير تطبيق لـ يلعب الطريقة التي تطبع بها رسالة مع حقول أغنية الهياكل إلى وحدة التحكم.
الجبهة الوطنيةرئيسي() {
// إنشاء مثيل لـ Song Struct
يترك أغنية = أغنية {
عنوان: خيط::من("افتتان البوهيمية"),
فنان: خيط::من("ملكة"),
};
// استدعاء طريقة التشغيل على مثيل الأغنية
song.play () ؛
}
ال أغنية المتغير هو مثيل لـ أغنية ويمكن للمتغير الوصول واستدعاء يلعب طريقة.
تنظيم كود الصدأ سهل
البرمجة الموجهة للكائنات تساعد في تنظيم الكود. بفضل نظام وحدة Rust ، يمكنك بسهولة تنظيم كود Rust الخاص بك أثناء تنفيذ مفاهيم OOP للتطبيق الخاص بك للحفاظ على الكود الخاص بك منظمًا وقابل للإدارة وبديهية.