عندما كنت أدرس جافا، واجهت مفهوم تعدد الأشكال. لدي ميل إلى فهم المبادئ الأساسية قبل الخوض في الاستخدام العملي، لذلك قمت بتوثيق تفسيري هنا.
المعنى الأصلي لتعدد الأشكال هو "التنوع". ومع ذلك، في سياق هذه المقالة، فإنه يشير إلى قدرة المتغير على الاحتفاظ بكائنات من أنواع مختلفة، طالما أن هناك علاقة من خلال وراثة الفئة أو تنفيذ الواجهة، دون التسبب في أخطاء.
بشكل عام، نوع المتغير يطابق نوع الكائن الذي يشير إليه.
Animal animal = new Animal();
ومع ذلك، عندما يقوم الكائن بتوسيع فئة ما، يمكن التعامل مع المتغير كنوع الفئة الفائقة.
Animal animal = new Dog(); // Dog extends Animal
علاوة على ذلك، إذا كان الكائن ينفذ واجهة، فيمكن معاملته كنوع الواجهة.
// Interface definition interface Animal { void makeSound(); // Method in the interface } // Classes implementing the interface class Dog implements Animal { public void makeSound() { System.out.println("Woof!"); // Dog-specific implementation } } class Cat implements Animal { public void makeSound() { System.out.println("Meow!"); // Cat-specific implementation } } // Main method public class Main { public static void main(String[] args) { // Assign objects to variables of the interface type Animal myDog = new Dog(); Animal myCat = new Cat(); // Call the interface method myDog.makeSound(); // Outputs "Woof!" myCat.makeSound(); // Outputs "Meow!" } }
يسمح لنا هذا بالتعامل مع فئات مختلفة بنفس النوع، مما يتيح البرمجة المرنة.
أثناء مناقشة كيفية اختلاف نوع المتغير ونوع الكائن، فإنه يثير السؤال: ما هو "النوع" بالضبط؟ بناءً على تحليلي، توصلت إلى أن النوع يخدم الأغراض التالية:
بالرجوع إلى المثال السابق:
Animal animal = new Dog(); // Dog extends Animal
يعني هذا أنه تم تخصيص الذاكرة للكلب، لكن المتغير يفسر المحتوى على أنه حيوان. يمكن تصور المفهوم على النحو التالي:
يعمل النوع كعدسة مرشح، حيث يحدد كيفية إدراك البيانات. من خلال تغيير العدسة، يمكنك التركيز على الطرق الشائعة في الفئة الفائقة أو طرق محددة عبر الواجهات.
قد يتساءل المرء لماذا لا نعلن دائمًا عن المتغيرات مع الفئة الفائقة إذا كانت ميزة تعدد الأشكال هي التعامل مع الأساليب الشائعة عبر الفئات. والسبب هو أن الذاكرة يتم تخصيصها فقط لبيانات الفئة الفائقة في مثل هذه الحالات.
بينما من الممكن تحويل فئة فرعية إلى فئة فائقة (upcasting)، فإن العكس ليس صحيحًا. وذلك لأن الفئة الفرعية تتضمن بيانات من الفئة الفائقة بالإضافة إلى بياناتها الفريدة. لذلك، يتم تخصيص الذاكرة مسبقًا للفئة الفرعية، مما يسمح باستخدام الأساليب الخاصة بالفئة الفرعية من خلال البث.
تعمل الواجهات أيضًا كأنواع، ودورها كعدسات تصفية لمعالجة البيانات المخزنة في ذاكرة الكائن يشبه من الناحية المفاهيمية دور الفئات. يتم تحديد الأساليب التي يتم استدعاؤها من خلال الواجهة حسب نوع الكائن، وليس نوع المتغير (الربط الديناميكي). وهذا يعزز فكرة أن نوع المتغير يعمل فقط كمرشح، مما يسمح لنا باستخدام البيانات التي تمت تصفيتها.
يعد تعدد الأشكال مفيدًا في السيناريوهات التي تحتاج فيها العمليات المشتركة إلى توحيد مع الاستفادة أيضًا من الخصائص الفردية. من خلال استكشافي، اكتسبت فهمًا أفضل أنه بينما يظل تخطيط ذاكرة الكائن محددًا حسب نوعه، فإن نوع المتغير يتحكم في كيفية تفسير تلك الذاكرة - وهو إدراك مهم بالنسبة لي.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3