سؤال

ما هي الأسباب الوجيهة لمنع الوراثة في Java، على سبيل المثال عن طريق استخدام الفئات النهائية أو الفئات باستخدام مُنشئ خاص واحد بدون معلمات؟ما هي الأسباب الوجيهة لجعل الطريقة نهائية؟

هل كانت مفيدة؟

المحلول

أفضل مرجع لك هنا هو البند 19 من كتاب جوشوا بلوخ الممتاز "جافا الفعالة"، المسمى "التصميم والتوثيق للميراث وإلا احظره".(إنه البند 17 في الطبعة الثانية والبند 15 في الطبعة الأولى.) يجب عليك قراءته حقًا، لكنني سألخصه.

يمكن أن يكون تفاعل الطبقات الموروثة مع والديها مفاجئًا وغير متوقع إذا لم يكن السلف مصممًا ليتم توريثه.

ولذلك يجب أن تأتي الفصول في نوعين:

  1. الطبقات مصممة لتكون ممتد, ومع ما يكفي من الوثائق لوصف كيفية القيام بذلك

  2. الطبقات ملحوظ أخير

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

نصائح أخرى

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

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

هناك 3 حالات استخدام يمكنك من خلالها الانتقال إلى الطرق النهائية.

  1. لتجنب فئة مشتقة من تجاوز وظيفة فئة أساسية معينة.
  2. هذا لأغراض أمنية، حيث توفر الفئة الأساسية بعض الوظائف الأساسية المهمة لإطار العمل حيث لا يُفترض أن تقوم الفئة المشتقة بتغييرها.
  3. تعد الطرق النهائية أسرع من طرق المثيل، حيث لا يوجد استخدام لمفهوم الجدول الافتراضي للطرق النهائية والخاصة.لذا، حيثما كان هناك احتمال، حاول استخدام الطرق النهائية.

الغرض من جعل الفصل النهائي:

بحيث لا يستطيع أحد أن يوسع تلك الطبقات ويغير سلوكها.

على سبيل المثال:فئة المجمع عدد صحيح هو فئة نهائية.إذا لم تكن تلك الفئة نهائية، فيمكن لأي شخص توسيع Integer إلى فئته وتغيير السلوك الأساسي لفئة integer.لتجنب ذلك، جعلت جافا كافة فئات المجمع كفئات نهائية.

قد ترغب في إنشاء كائنات غير قابلة للتغيير (http://en.wikipedia.org/wiki/Immutable_object)، قد ترغب في إنشاء مفردة (http://en.wikipedia.org/wiki/Singleton_pattern)، أو قد ترغب في منع شخص ما من تجاوز الطريقة لأسباب تتعلق بالكفاءة أو السلامة أو الأمان.

والميراث مثل المنشار - قوية جدا، ولكن فظيعة في الأيدي الخطأ. إما أن تصميم الفئة لتكون موروثة من (والتي يمكن أن تحد من المرونة وتأخذ وقتا أطول) أو يجب منع ذلك.

وانظر جافا الفعالة البنود 2ND إصدار 16 و 17، أو بلدي بلوق وظيفة " ضريبة الإرث ".

وهممم ... أستطيع أن أفكر في أمرين:

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

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

 String blah = someOtherString;

وبدلا من نسخ السلسلة الأولى. ومع ذلك، إذا كنت تستطيع فرعية سلسلة، يمكنك إضافة أساليب لأن تسمح قيمة السلسلة إلى تعديل، والآن أي رمز يمكن أن تعتمد بعد الآن أن السلسلة سوف تبقى كما هي إذا كان مجرد نسخ السلسلة على النحو الوارد أعلاه، وبدلا من ذلك يجب تكرار السلسلة.

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

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

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

وأنت تريد أن تجعل من النهائي طريقة بحيث تجاوز الطبقات لا يغير سلوكه. عندما كنت تريد أن تكون قادرة على تغيير السلوك جعل الجمهور الأسلوب. عند تجاوز أسلوب العام يمكن تغييرها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top