البرمجة

وراثة الكلاسات في جافا

في برمجة الجافا، هناك قاعدة تنص على أن إذا لم يتم تحديد مستوى وصول (Access Specifier) لبناء (Constructor) في الكلاس، فإن مستوى الوصول الافتراضي (Default Access Specifier) يكون نفس مستوى الوصول للكلاس نفسه. ومع ذلك، هناك استثناء في حالة الوراثة (Inheritance).

في المثال الذي قدمته، الكلاس TestClass1 يحمل مستوى وصول public. وعلى هذا الأساس، ينبغي أن تكون طرق البناء (Constructors) في هذا الكلاس تكون عمومية (Public) بشكل افتراضي. ولكن عندما تورث كلاس TestClass2 من TestClass1، يحدث تغيير بالسلوك.

في حالة الوراثة، إذا كانت الطريقة البنائية (Constructor) في الكلاس الأب (TestClass1 في هذه الحالة) غير معرفة بشكل واضح، فستكون محتوية ضمن مستوى وصول محدد. وهذا يعني أن الطريقة البنائية الافتراضية (Default Constructor) في الكلاس الابن (TestClass2 في هذه الحالة) لن يكون لها نفس مستوى وصول الكلاس نفسه، بل ستكون مستوى وصولها “محتملة” (Package-Private)، وهو مستوى الوصول الذي يعني أنها مرئية داخل نفس الحزمة (Package) فقط.

في الشفرة التي قدمتها، يظهر الخطأ “constructor TestClass2() is not visible.” لأن الطريقة البنائية (Constructor) في TestClass2 ليست مرئية في الشفرة الرئيسية (MainClass)، وذلك لأنها مستوى وصولها هو المستوى الافتراضي (Package-Private) بسبب عدم تحديدها بشكل صريح.

لتجاوز هذا الخطأ، يمكنك تحديد طريقة بناء عامة (Public Constructor) في TestClass2 بشكل صريح كما هو موضح في الشفرة التالية:

java
package package2; public class TestClass2 extends TestClass1 { public TestClass2() { super(); // يجب استدعاء بناء الكلاس الأب System.out.println("In TestClass2's constructor"); } }

باستخدام الكلمة الأساسية public، يتم جعل الطريقة البنائية في TestClass2 مرئية للكائنات خارج الحزمة، بما في ذلك الكائنات التي يتم إنشاؤها في الشفرة الرئيسية (MainClass).

المزيد من المعلومات

بالتأكيد، سأواصل توسيع المقال لتوضيح المفاهيم بشكل أكبر.


عندما يتم توريث كلاس من كلاس آخر في الجافا، يتم نقل الخصائص والسلوكيات من الكلاس الأب إلى الكلاس الابن. ومن بين هذه الخصائص تأتي الطرق البنائية (Constructors) التي تعمل على بناء الكائنات من الكلاس.

في المثال الذي قدمته، الكلاس TestClass2 يورث من TestClass1. ومع ذلك، الكلاس الأب TestClass1 ليس لديه طريقة بناء عامة (Public Constructor). وهذا يعني أنه على الرغم من أن TestClass1 نفسها تكون مرئية بشكل عام، فإن طريقة بنائها الافتراضية (Default Constructor) ستكون محتملة (Package-Private)، مما يعني أنها لا تكون مرئية خارج الحزمة.

عند إنشاء كائن من TestClass2 في الشفرة الرئيسية (MainClass)، يتم تنفيذ طريقة البناء المتوفرة في TestClass2، والتي تحاول ضمنها استدعاء طريقة البناء في TestClass1 باستخدام super(). وهنا يكمن الخطأ، حيث أن طريقة البناء في TestClass1 غير مرئية خارج الحزمة، مما يؤدي إلى خطأ “constructor TestClass2() is not visible.”.

لتجاوز هذا الخطأ، يمكننا إما جعل طريقة البناء في TestClass1 عامة (Public)، أو استدعاء طريقة البناء الصحيحة في TestClass2 باستخدام super() وتحديد طريقته بشكل صريح.

الآن، بعد إضافة الطريقة البنائية العامة في TestClass1 أو استدعاء البناء الصحيح في TestClass2، يتمكن الكود من تنفيذ بناء الكائنات بشكل صحيح دون أي أخطاء مرئية.

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

هذا يظهر كيف يمكن لفهم تفاصيل روابط الوراثة وتأثيرها على مستويات الوصول أن يساعد في تجنب الأخطاء وفهم سلوك البرنامج بشكل أفضل.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر