اذهب إلى المحتوى

السؤال

نشر

في لغات البرمجة نحتاج في بعض الأحيان إلى إستخدام واجهة interface مثل الموجود في PHP أو Java، أعلم أن JavaScript لديها أصناف Class ولكن  عندما حاولت البحث عن الوجهات في جافاسكريبت أو عن كيفية تطبيق هذا الأمر في جافاسكريبت لم أوفق.

كيف يمكن تطبيق مبدأ الواجهات interfaces في جافاسكريبت JavaScript؟

Recommended Posts

  • 1
نشر

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

class MyInterface {
    
    // تابع اجباري
    example(a, b) { 
        this._WARNING('sum(a, b)'); // يتم رمي هذا الخطأ في حالة عدم اعادة تعريفه
    }


    // مولد خطأ مخصص
    _WARNING(fName='unknown method') {
        console.warn( 'WARNING! Function "' +fName+ '" is not overridden in '+ this.constructor.name);
    }
}

class MyCorrectUsedClass extends MyInterface {
    /** اعادة تعريف التابع */
    example(a, b) {
        return a+b;
    }
}
class MyIncorrectUsedClass extends MyInterface {
    // عدم اعادة التعريف
}



let correct = new MyCorrectUsedClass();
let incorrect = new MyIncorrectUsedClass();


console.log('correct.sum(1, 2) =', correct.example(1, 2));
console.log('incorrect.sum(1, 2) =', incorrect.example(1, 2));

سيعطي هذا رسالة خطأ مخصصة تخبرنا أننا يجب ان نعيد تعريف التابع example قبل استعماله، وهو بشكل ما أشبه بتطبيق واجهات.

مثال عن خرج النتيجتين: 

"correct.sum(1, 2) =", 3
"WARNING! Function \"sum(a, b)\" is not overridden in MyIncorrectUsedClass"
"incorrect.sum(1, 2) =", undefined

 

  • 1
نشر

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

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

فيمكنك ببساطة استخدام الواجهة في typescript كالتالي:

interface Person {
  type: PersonType;
  name?: string;
  age?: number;
}
 
function printPerson(opts: Person) {
  // ...
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...