سؤال

واجهات تسمح لك لإنشاء التعليمات البرمجية التي تحدد أساليب الدراسة أن تنفيذ ذلك.لا يمكنك إلا أن إضافة أي رمز على هذه الأساليب.

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

الآن إذا كنت يمكن أن يحقق نفس الهدف مع فئات مجردة, لماذا نحن بحاجة حتى مفهوم واجهات?

لقد قيل لي أن له علاقة مع OO نظرية من C++ إلى جافا ، وهو ما PHP OO الأشياء على أساس.هو مفهوم مفيد في جافا ولكن ليس في PHP?هل هو مجرد وسيلة للحفاظ على من الحصول النائبة تناثرت في خلاصة الدرجة ؟ أنا في عداد المفقودين شيئا ؟

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

المحلول

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

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

نصائح أخرى

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

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

واحدة من هذه المشاكل:

"الماس المشكلة" (يشار إليها أحيانا باسم "الماس القاتل من الموت") هو اللبس الذي ينشأ عند فئتين B و C ترث من فئة D يرث من كل من B و C.إذا كان هناك طريقة في ذلك ب " و " ج تجاوزها ، و د لا تجاوز ذلك ، ثم إصدار الأسلوب لا د ترث:أن ب ، أو ج ؟

المصدر: https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

لماذا/متى تستخدم واجهة? مثال...جميع السيارات في العالم لديهم نفس واجهة (طرق)... AccelerationPedalIsOnTheRight(), BrakePedalISOnTheLeft().تخيل أن كل سيارة ماركة شأنه أن هذه "الأساليب" مختلفة من نوع آخر.بي أم دبليو قد الفرامل على الجانب الأيمن و هوندا قد الفرامل على الجانب الأيسر من عجلة القيادة.الناس يجب أن تتعلم كيف أن هذه "الأساليب" العمل في كل مرة أنها سوف تشتري علامة تجارية مختلفة من السيارة.هذا هو السبب في انها فكرة جيدة أن يكون نفس واجهة متعددة "الأماكن".

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

// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

هذه الطريقة ، Create() الطريقة سوف تكون دائما تستخدم نفس الطريقة.لا يهم إذا نحن باستخدام MySqlPerson الدرجة أو MongoPerson فئة.كيف السبيل ونحن نستخدم أسلوب يبقى نفسه (واجهة يبقى نفسه).

على سبيل المثال ، سيتم استخدامها مثل هذا (في كل مكان في التعليمات البرمجية):

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

بهذه الطريقة, شيء مثل هذا لا يمكن أن يحدث:

new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

انه من الاسهل بكثير أن نتذكر واحد واجهة استخدام نفس واحدة في كل مكان ، مما متعددة مختلفة منها.

بهذه الطريقة, داخل Create() الأسلوب يمكن أن تكون مختلفة عن فئات مختلفة ، دون أن يؤثر ذلك على "خارج" القانون ، الذي يدعو هذا الأسلوب.كل خارج المدونة يجب أن تعرف أن طريقة Create() 1 المعلمة ($personObject) لأن الخارج الرمز استخدام/استدعاء الأسلوب.خارج قانون لا يهمني ما يحدث داخل الأسلوب ؛ فقط يجب أن تعرف كيفية استخدام/نسميها.

يمكنك القيام بذلك من دون واجهة كذلك, ولكن إذا كنت تستخدم واجهة إنه "أكثر أمانا" (لأنه يمنعك من ارتكاب الأخطاء).واجهة يضمن لك هذا الأسلوب Create() سوف يكون نفس التوقيع (نفس النوع و نفس العدد من المعلمات) في جميع الطبقات التي تنفذ واجهة.بهذه الطريقة يمكنك أن تتأكد من أن أي الطبقة التي تنفذ IPersonService واجهة لديها طريقة Create() (في هذا المثال) وسوف تحتاج فقط 1 المعلمة ($personObject) للحصول على ما يسمى/المستخدمة.

الفئة التي تنفذ واجهة يجب تنفيذ جميع الأساليب التي واجهة/لديه.

أتمنى أنني لم أكرر نفسي كثيرا.

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

في حين الميراث من فئة مجردة هو "هو" العلاقة, هذا ليس دائما ما تريد ، وتنفيذ واجهة هو أكثر من "أعمال مثل" علاقة.هذا الاختلاف يمكن أن تكون كبيرة جدا في سياقات معينة.

على سبيل المثال, دعونا نقول لديك فئة مجردة حساب من العديد من الفئات الأخرى تمديد (أنواع الحسابات وما إلى ذلك).أنه يحتوي على مجموعة معينة من الأساليب التي لا تنطبق إلا على هذا النوع المجموعة.بيد أن بعض هذه الحسابات فرعية تنفيذ Versionable ، أو ' Listable ، أو قابلة للتعديل بحيث يمكن ألقيت في وحدات التحكم التي تتوقع استخدام واجهات برمجة التطبيقات هذه.تحكم لا يهمني ما نوع الكائن هو

على النقيض من ذلك, يمكن أيضا إنشاء كائن لا تمتد من الحساب ، ويقول مستخدم فئة مجردة و لا تزال تنفذ ' Listable و للتحرير ، ولكن ليس Versionable الذي لا معنى له هنا.

في هذه الطريقة, أنا أقول أن FooUser فرعية غير حساب ، ولكن لا تتصرف مثل تحرير الكائن.وبالمثل BarAccount يمتد من الحساب ، ولكن ليس المستخدم فرعية ، ولكن تنفذ للتحرير, ' Listable و أيضا Versionable.

مضيفا كل هذه واجهات برمجة التطبيقات بالنسبة للتحرير, ' Listable و Versionable في فئات مجردة في حد ذاته لن يكون إلا تشوش القبيح ، ولكن إما تكرار واجهات المشتركة في حساب المستخدم ، أو قوة بلدي كائن المستخدم لتنفيذ Versionable, ربما فقط رمي استثناء.

واجهات أساسا مخطط ما يمكن أن تخلق.أنها تحدد ما هي أساليب فئة يجب أن يكون, ولكن يمكنك إنشاء أساليب إضافية خارج تلك القيود.

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

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

لقد اعتقدت دائما من واجهات كنمط الخارجية المطورين أو إضافية الأوامر لضمان الأشياء صحيحة.

سوف تستخدم واجهات في PHP:

  1. لإخفاء تنفيذ إنشاء بروتوكول الوصول إلى فئة من الكائنات وسيلة التغيير الأساسية التنفيذ دون إعادة بيع ديون في كل الأماكن التي كنت قد استخدمت هذه الكائنات
  2. للتحقق من نوع - كما في التأكد من أن المعلمة لديها نوع معين $object instanceof MyInterface
  3. لفرض المعلمة التحقق في وقت التشغيل
  4. إلى تنفيذ العديد من السلوكيات في فئة واحدة (بناء أنواع معقدة)

    فئة السيارات تنفذ EngineInterface, BodyInterface, SteeringInterface {

بحيث Car كائن ca الآن start(), stop() (EngineInterface) أو goRight(),goLeft() (واجهة التوجيهي)

وغيرها من الأشياء التي لا أستطيع التفكير الآن

رقم 4 هو على الأرجح الأكثر وضوحا التي لا يمكن معالجة مع فئات مجردة.

من التفكير في جاوة:

واجهة يقول: "هذا هو ما جميع الطبقات التي تنفذ هذه واجهة معينة سوف تبدو وكأنها". وبالتالي فإن أي رمز يستخدم واجهة معينة يعرف ما هي الطرق التي يمكن أن يطلق على تلك الواجهة ، هذا كل شيء.لذلك يستخدم واجهة لإنشاء "بروتوكول" بين الطبقات.

واجهات موجودة ليست قاعدة على الطبقات التي يمكن أن تمتد ولكن خريطة المهام المطلوبة.

وفيما يلي مثال على استخدام واجهة حيث فئة مجردة لا يصلح:
دعونا نقول لدي تقويم التطبيقات التي تسمح للمستخدمين استيراد بيانات تقويم من مصادر خارجية.أود أن أكتب دروس للتعامل مع استيراد كل نوع مصدر البيانات (ical, rss, atom, json) كل من هذه الطبقات تنفيذ واجهة مشتركة تكفل جميعها المشتركة العامة أساليب بلدي التطبيق يحتاج إلى الحصول على البيانات.

<?php

interface ImportableFeed 
{
    public function getEvents();
}

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

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

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

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

<?php
interface ImportableFeed 
{
    /**
     * @return array
     */
    public function getEvents();
}

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

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

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

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

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

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

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

tl;dr:واجهات يحدد قائمة من الطرق التي يجب اتباعها (اعتقد API) ، في حين أن فئة مجردة يعطي بعض الأساسي/شيوعا الوظائف التي فرعية صقل لتلبية احتياجات محددة.

لا أستطيع أن أتذكر إذا PHP مختلفة في هذا الصدد ، ولكن في جافا, يمكنك تنفيذ واجهات متعددة ، لكن لا يمكنك أن ترث مجردة متعددة الطبقات.افترض PHP يعمل بنفس الطريقة.

في PHP يمكنك تطبيق واجهات متعددة من قبل إفصل بينهم بفاصلة (أعتقد أنا لا أجد أن نظيف soloution).

كما لعدة فئات مجردة يمكن أن يكون لديك عدة ملخصات تمتد بعضها البعض (مرة أخرى أنا لست متأكدا تماما عن ذلك ولكن أعتقد أنني قد رأيت هذا من قبل في مكان ما).الشيء الوحيد الذي لا يمكن تمديد نهائي فئة.

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

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

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

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

واجهات مثل الجينات الخاصة بك.

فئات مجردة مثل الفعلي الخاص بك الآباء.

أغراضها وراثية ، ولكن في حالة فئات مجردة مقابل واجهات, ما يورث هو أكثر تحديدا.

وفيما يلي نقاط PHP واجهة

  1. يتم استخدامه لتحديد المطلوب لا من الأساليب في الصف [إذا كنت تريد تحميل html ثم معرف اسم مطلوب حتى في هذه الحالة واجهة تشمل setID و setName].
  2. واجهة بدقة القوة الفئة تشمل جميع أساليب تحديد في ذلك.
  3. يمكنك فقط تحديد طريقة في التفاعل مع الجمهور الوصول إليها.
  4. يمكنك أيضا توسيع واجهة مثل الطبقة.يمكنك توسيع واجهة في php باستخدام يمتد الكلمة.
  5. تمتد واجهة متعددة.
  6. يمكنك تنفيذ واجهات 2 إذا كان كل وظيفة حصة مع نفس الاسم.فإنه سيتم رمي خطأ.

رمز المثال :

interface test{
    public function A($i);
    public function B($j = 20);
}

class xyz implements test{
    public function A($a){
        echo "CLASS A Value is ".$a;
    }
    public function B($b){
        echo "CLASS B Value is ".$b;
    }
}
$x = new xyz();
echo $x->A(11);
echo "<br/>";
echo $x->B(10);

رأينا أن فئات مجردة واجهات تتشابه في أنها توفر مجردة الأساليب التي يجب أن تنفذ في فصول الأطفال.ومع ذلك, لا يزال لديهم الاختلافات التالية:

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

2.كل الطرق في واجهة يجب أن يكون في العامة الرؤية نطاق.

3.فئة يمكن أن تنفذ أكثر من واجهة واحدة ، في حين أنه يمكن أن ترث واحد فقط من فئة مجردة.

                                  interface                      abstract class
the code                     - abstract methods               - abstract methods
                             - constants                      - constants                  
                                                              - concrete methods
                                                              - concrete variables

access modifiers             
                             - public                         - public
                                                              - protected
                                                              - private
                                                                etc.
number of parents          The same class can implement
                           more than 1 interface              The child class can 
                                                              inherit only from 1 abstract class

نأمل أن يكون هذا سوف يساعد على أي شخص أن يفهم!

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

واجهة يعمل في "العقود" ، مع تحديد مجموعة من الفئات الفرعية ، ولكن ليس كيف تفعل ذلك.

القاعدة

  1. واجهة لا يمكن إنشاء مثيل.

  2. لا يمكنك تنفيذ أي طريقة في واجهة أيكما أنه يحتوي فقط .التوقيع على الأسلوب ولكن لا تفاصيل(الجسم).

  3. واجهات يمكن أن تحتوي على الطرق و/أو الثوابت ، ولكن لا الصفات.واجهة الثوابت لديهم نفس القيود المفروضة على الطبقة الثوابت.أساليب واجهة ضمنا مجردة.

  4. واجهات يجب أن لا تعلن منشئات أو المتلفات, لأن هذه هي تفاصيل التنفيذ على الطبقة المستوى.
  5. كل الطرق في واجهة بد أن الرؤية العامة.

الآن دعونا نأخذ مثالا على ذلك.لنفترض أن لدينا اثنين من اللعب:واحد كلب و الآخر هو القط.

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

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

هذه حالة جيدة لاستخدام واجهة ، وليس فئة مجردة لأن تطبيقات مختلفة.لماذا ؟ تذكر

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

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