كيفية تحقيق مكافئ C لمثيل Java
في Java، يسمح لك عامل التشغيل "instanceof" بتحديد ما إذا كان الكائن ينتمي إلى فئة معينة أو واجهة. في لغة C، هناك عدة طرق لتحقيق هذه الوظيفة.
الصب الديناميكي مع RTTI
أحد الأساليب هو استخدام الصب الديناميكي مع تمكين معلومات نوع وقت التشغيل (RTTI). يتطلب هذا منك تضمين الرؤوس الضرورية:
#include
#include
وبعد ذلك يمكنك إجراء تحويل ديناميكي باستخدام:
if(NewType* v = dynamic_cast(old)) {
// old was safely casted to NewType
v->doSomething();
}
لاحظ أن هذا الأسلوب يتطلب تمكين دعم RTTI في المترجم الخاص بك.
الوظائف الافتراضية
هناك طريقة أخرى وهي استخدام الوظائف الافتراضية. يمكنك تحديد دالة افتراضية في الفئة الأساسية وتجاوزها في الفئات المشتقة. بعد ذلك، يمكنك التحقق من النوع الديناميكي للكائن عن طريق استدعاء وظيفته الافتراضية:class Base {
public:
virtual void doSomething() {}
};
class Derived : public Base {
public:
void doSomething() override {}
};
...
if(auto* derived = dynamic_cast(old)) {
derived->doSomething();
}
تبديل النوع أخيرًا، يمكنك استخدام مفتاح النوع لتحديد النوع الديناميكي للكائن. يعتمد هذا الأسلوب على فئة type_info:
if(old.IsSameAs(typeid(NewType))) { // تم إرسال القديم بأمان إلى NewType NewType* v = static_castif(old.IsSameAs(typeid(NewType))) {
// old was safely casted to NewType
NewType* v = static_cast(old);
v->doSomething();
}
الاعتباراتعلى الرغم من أن هذه الطرق توفر وظائف مشابهة لمشغل "مثيل" Java، فمن المهم أن تتذكر أن الصب الديناميكي والتحقق من النوع يمكن أن يؤدي إلى عقوبات على الأداء. من المستحسن النظر في استخدام أساليب بديلة مثل الوظائف الافتراضية أو مفاتيح الكتابة للحصول على أداء أفضل في التطبيقات الهامة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3