قام DataCamp مؤخرًا بافتتاح أول دورة لـ Scala: مقدمة لـ Scala. اشارك فيها!
قد تكون مهتمًا أيضًا بقراءة دروس التوريات التالية:
- دروس المبتدئين لـ Scala
- الإلساء والإختيار في ـ Scala
- المحركات في ـ Scala
- قوائم في ـ Scala
- الصفات والأجسام في ـ Scala
مقدمة
المميزة هي مفهوم يستخدم بشكل رئيسي في البرمجيات التي تتمكن من تمديد قدرات صنف مع مجموعة من الأمور.
السمات تشبه إلى حد كبير الواجهات في لغة البرمجة جافا. على عكس الفئة، لا يمكن تهيئة سمات سكالا ولا تحتوي على حجج أو معايير. ومع ذلك، يمكنك توريثها (تمديدها) باستخدام الفئات والكائنات. ومع ذلك، توفر السمات مجموعة محددة من الأساليب/الدوال التي تنفذ سلوكًا في فئة وتتوقع أن تقوم الفئة بتنفيذ مجموعة من الأساليب التي تقوم بعد ذلك بتحديد السلوك المقدم.
السمة التي تستخدم لتعريف كائن يتم إنشاؤها كمزيج من الأساليب التي يمكن استخدامها بواسطة فئات مختلفة دون الحاجة إلى توريث متعدد. ومع ذلك، قد تكون هناك استثناءات حيث تحتوي سمتان على أسلوب بنفس الاسم (تصادم الأسماء)، والتي يجب استخدامها بواسطة فئة، وفي هذه الحالة يجب حل الغموض بشكل صريح.
يمكن أن تحتوي السمات على أساليب مجردة وغير مجردة، وحقول كأعضاء لها. عندما لا تقوم بتهيئة أسلوب في سمة، فإنها تكون مجردة، بينما تلك التي تم تهيئتها تسمى غير مجردة. في الأساليب المجردة، تتولى الفئة التي تنفذ السمة عملية التهيئة.
والآن، دعونا نفهم سمات سكالا بسرعة بمساعدة بعض الأمثلة!
صيغة سمة سكالا
الصيغة الخاصة بسمة سكالا بسيطة، فهي تُعرف بالكلمة المفتاحية trait
تليها اسم السمة.
trait Trait_Name{ // المتغيرات // الأساليب }

كما ترون من تعريف الصفة أعلاه، تم تعريف صفة تدعى DataCamp
والتي لا تحتوي على أي متغيرات أو مétodos معينين داخلها.
دعونا نتحدث إلى مثال بسيط للصفات في Scala والذي سيساعدك على أكبر وضوح حول كيفية عملها بالبرمجيات.
وكما تم مناقشة في المقدمة، تتم تمتركة الصفات Scala من تلك الصفة باستخدام كلمة التوجيه extends
.
class Scala_Tutorial extends DataCamp{ // متغيرات // مétodos }
دعونا نحدد صفة تدعى Scala_Course
والتي ستكون متخذة من خلال الصفة DataCamp
. داخل الtrait
، ستقوم بتعريف مétodo scala()
من النوع التجريدي والذي سيتم تعريفه في الصفة DataCamp
.
trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def scala(){ println("DataCamp has recently launched there first Scala course") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.scala() } }
الآن دعونا نتجرب ما يلي البرمجيات السابقة.

في المثال السابق كان المétodo scala()
من النوع التجريدي ولهذا تم إعادة تعريفه في الصفة التي تتم تمتركتها من خلال الصفة.
ولكن ماذا لو كان لديك مétodo (غير تجريدي) الذي يتم تنفيذه بالفعل في الصفة؟ حسنًا، في هذه الحالة لن تتوجب على الصفة التي تتم تمتركتها تطوير هذا المétodo الذي يتم تنفيذه بالفعل في الصفة.
دعونا نفهم هذا مع مثال صغير.
trait BMW{ // خصائص المتغيرات var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // طريقة خصائص: ليست تجريدية def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } class Car extends BMW{ // متغيرات الفئة var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 // طريقة الفئة def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // طريقة الرئيسية def main(args: Array[String]) { // جهة الفئة var obj = new Car(); println("Calling the Class Method") obj.Merc_Specs(); println("Calling the Trait Method") obj.Display(); } }
دعونا نقوم بتشغيل البرمجيات المذكورة أعلاه:

حالما أدركت الفرق بين الطرق التجريدية وغير التجريدية، دعونا نرى ما قد يفوت عندما لا يتم تنفيذ طريقة تجريدية في الفئة التي تم تخطيها أو تم توسيعها.
سنستخدم مثال متشابه نفسهلفهم هذا الموضوع.
trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def print(){ println("Error: Class DataCamp needs to be Abstract") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.print() } }
سينتج تشغيل البرمجيات المذكورة أعلاه خطأ، كما يظهر أسفل، لأنك لم تحدد طريقة التجريد scala()
(تجريدية) في الفئة التي تم تخطيها.

لجعل البرمجيات المذكورة أعلاه تعمل، يمكن أن يكون هناك حلين ممكنين:
- حدد طريقة
scala()
في الفئةDataCamp
أو - حدد الفئة DataCamp كتجريدية.
الموضوع الأخير لدرسنا اليوم هو كيف يمكنك توريث متعدد من الخصائص في واحدة من الفئات. لذلك دعونا ننتهي بهذا سريعًا.
trait A{ // الطرق } trait B{ // الطرق } class C extends A with B{ }
trait BMW{ var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 } trait Merc{ var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 } class Car extends BMW with Merc{ def BMW_Specs() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // طريقة الرئيسية def main(args: Array[String]) { // جهة الفئة var obj = new Car(); println("Calling the BMW Trait") obj.BMW_Specs(); println(); println("Calling the Merc Trait") obj.Merc_Specs(); } }
أخيرًا، دعونا نشغل الكود أعلاه.

تهانينا!
تهانيكم على إنهاء هذا الدرس.
أنت الآن تعرف ما هي الصفات في البرمجة وكيفية استخدامها في سكالا. تمرين جيد لك سيكون العثور على حل للطريقة الأساسية لم تكن محددة في الصف الذي تورثه. حاولت كتابة الكود لنفس الأمر وانظر إذا تم تشغيل الكود بدون أي خطأ ترجمة. تلميح صغير، قد ترغب في النظر إلى الصفوف الأساسية في سكالا.
يرجى الاحترام في السؤال أي أسئلة متصلة بهذا الدرس في قسم التعليقات أدناه.
أخيرًا، لاتنسى الإشتراك في دورة سكالا الجديدة على DataCamp، مقدمة إلى سكالا.