سؤال

وكنت أقرأ على الكلمة مختومة في C #. أنا غير قادر على تذكر آخر مرة كنت ترث من مكتبة القياسية. في ج ++ أتذكر وراثة واجهة الأمراض المنقولة جنسيا التي typedef وأنواع قليلة وتستخدم بعض المعلمات بلدي. ولكن هذا هو 1) تافهة 2) واجهة

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

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

ملحوظة: أنا استخدم مشغل SomeClass وSomeClass () {العودة m_someClass. } في حالة ولست بحاجة لتمرير الكائن بصفتي فئة أخرى. أنه يعمل بشكل جيد.

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

المحلول

ويتم استخدامه في الواقع في C ++، لجميع هذه لا هو بين من أنواع الميراث (على سبيل المثال. وراثة التنفيذ، mixins، تعزيز :: noncopyable، حيث ترث منه وجعل صفك noncopyable، وتعزيز :: مشغلي أين أنت ترث من بعض الطبقة وأنها ستضيف بعض المشغلين لصفك). أيضا، عند القيام metaprogramming مع أنواع C ++، وراثة من نوع آخر (ق) هو واحد من أبسط طرق تأليف أنواع.

وهناك حالة أخرى حيث كنت ترث من فئة ليس لديها وظائف الظاهري، ولكن بمثابة "نوع من" واجهة، هو تعدد الأشكال ثابت (تقنيات مثل CRTP، حيث الطبقة ConcreteA: BaseA). انهم لا يحتاجون الى وظائف افتراضية، ليتم حل كل شيء في الوقت الترجمة.

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

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

نصائح أخرى

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

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