التغليف مقابل الوراثة - كيفية استخدام وظيفة محمية؟

StackOverflow https://stackoverflow.com/questions/289841

سؤال

في لغات OOP مثل C# أو VB.NET، إذا قمت بإنشاء الخصائص أو الأساليب في فئة فائقة protected لا يمكنني الوصول إليها في النموذج الخاص بي - لا يمكن الوصول إليها إلا في صفي الذي يرث من تلك الفئة المتميزة.

للوصول إلى تلك الخصائص أو الأساليب التي أحتاج إليها public, ، الذي يهزم التغليف، أو يعيد كتابتها في صفي، الذي يهزم الميراث.

ما هي الطريقة الصحيحة للقيام بذلك؟

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

المحلول

و"بحاجة إلى جعلها الجمهور الذي يهزم التغليف"

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

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

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

إذا لم يكن لديك للتعامل مع المحامين، وتنظر في القيام التغليف حق ولكن ترك كل شيء الجمهور.

نصائح أخرى

إذا كان لديك كود الذي يحتاج لطرح فئة لإجراء عملية معينة ولكن الطبقة لا تمثل الشفرة وسيلة للقيام بذلك ثم فئة لا تفي متطلبات لك الرموز.

وقليلا في مثل قوله لقد حصلت على سيارة (السيارات) التي تحتوي على عجلة القيادة محمية لذلك لا يمكن الوصول إليه. كانت السيارة لا فائدة بالنسبة لي.

واجعلوا هؤلاء الأعضاء العامة (أو داخلية على الأقل) واستخدامها أو التخلص من الطبقة واستخدام واحد أن يعطي كود المستهلكة بك الميزات التي يحتاجها.

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

عذرا، انه ليس واضحا ما الذي تعنيه "في نموذج بلادي" - ما هي العلاقة بين النموذج الخاص بك والخاص بك فئتين؟ إذا الفصول الدراسية التحكم في المشروع نفسه، وتريد الوصول إلى الخصائص من النموذج، يجب استخدام لكم الكلمة 'الداخلية'.

هناك ثلاث طرق على الأقل يمكنك من خلالها تحديد من يمكنه استخدام طريقة مثيل معينة لمثيلات فئة معينة:

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

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

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