سؤال

في C#، لدينا واجهات.من أين جاء هؤلاء؟لم تكن موجودة في C++.

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

المحلول

الواجهات قديمة جدًا، وهي موجودة منذ فترة طويلة.

في وقت مبكر (منتصف وأواخر السبعينيات) استخدمت اللغات غير الموجهة مثل Modula وEuclid بنيات تسمى "الوحدات النمطية" لتحديد الواجهات بين المكونات.ستتواصل المكونات بعد ذلك مع بعضها البعض عبر وحدات الاستيراد والتصدير الصريحة.الواجهات في C# هي تطورات موجهة للكائنات لنفس المفهوم.

تمتد الواجهات في C# مباشرةً من مفهوم الواجهات في C++ (وJava)، حيث تم استخدامها كجزء من COM لوصف واجهات المكونات الموجهة للكائنات.

يحرر: من خلال إجراء قدر صغير من البحث، كانت أول لغة يمكن أن أجدها باستخدام كلمة رئيسية "واجهة" صريحة هي Modula-3، وهي مشتقة من Modula التي تم إنشاؤها حوالي عام 1986.

نصائح أخرى

كانت الواجهات أيضًا جزءًا أساسيًا من COM، والتي كانت تقنية ناجحة جدًا لفصل الواجهات عن التنفيذ.

لقد جاءوا من Java، وقد تم تقديمهم لأن Java (و C#) لا يسمحون بالميراث المتعدد.

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

إنهاء التعديل

على سبيل المثال، في لغة C++، يمكن أن يكون لديك فئة تسمى Dog موروثة من Animal وMammal.

في C#، سيكون لديك فئة أساسية تسمى Animal، وتستخدم واجهة (IMammal).يعد تدوين التسمية I تاريخيًا من C++ (تم استخدامه للإشارة إلى فئة افتراضية مجردة)، وتم نقله إلى Java ولكنه أكثر أهمية في C#، لأنه لا توجد طريقة سهلة لمعرفة ما هي الفئة الأساسية وما هي واجهة من إعلان فئة C#:

public class Dog : Animal, IMammal

بينما في Java كان الأمر أكثر وضوحًا:

public class Dog extends Animal implements IMammal

يعد الميراث المتعدد أمرًا صعبًا للغاية، لذلك تم اشتقاق واجهات لتبسيطه.يمكن لفئة C# أن ترث فقط من فئة أساسية واحدة، ولكن يمكنها تنفيذ عدد N من الواجهات.

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

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

البريد الإلكتروني من باتريك نوتون

كانت الواجهات موجودة في لغة C++ إذا كنت تستخدم برمجة COM، وهو المكان الذي تنشأ فيه اتفاقية IPrefix.

على الرغم من أن C++ نفسها لم تكن تدعم الواجهات أصلاً، إلا أن COM/C++ استخدمت مكتبات الأنواع التي تم إنشاؤها من لغة تعريف الواجهة والتي لها غرض وحيد هو تعريف الواجهات، واستخدمت واجهه المستخدم الكلمة الأساسية قبل وقت طويل من قيام Java أو C#.

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

يسمح C++ بالميراث المتعدد.عندما تم تطوير Java، تم تحديد وراثة واحدة ولكن تم السماح للفئات بتنفيذ واجهات متعددة.حملت C# هذا المفهوم.

كانت موجودة في لغة C++، لكنها كانت تُعرف بالفئات الأساسية الافتراضية، والتي تتكون فقط من وظائف افتراضية خالصة.هذا هو المكان الذي جاءت منه البادئة "I-" للواجهات - للتمييز بين الفئات الأساسية الافتراضية والفئات الأساسية المجردة.

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

نفس المفهوم موجود في c++ لكنه ليس هو نفسه تمامًا.يطلق عليهم "الفصول الافتراضية الخالصة"

http://en.wikipedia.org/wiki/Virtual_function

إنها موجودة بصيغة مختلفة ولكنها موجودة للسماح بتعدد الأشكال في OOP.

أول تطبيق للواجهات التي أعرفها في مجال الحوسبة جاء من CORBA.

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

وبالمناسبة، على الرغم من أنها لم يتم إنشاؤها لتقليل مشكلات الإصدار، فمن المؤكد أنها يمكن أن تساعد في حلها.

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

static string Method(int i)

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

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

الواجهة هي مجرد عقد.تقول الأعضاء الذين يجب على المثيل تنفيذهم.ومع ذلك، فهو يفعل ذلك دون تنفيذ أي سلوكيات افتراضية.

حسنًا، لم يكن هناك أي بناء جملة لآلية لغة متكاملة لذلك، ولكن يمكنك تحقيق واجهات في لغة C++ باستخدام فئات افتراضية خالصة.

class IFoo
{
public:
  void Bar() =0;
  void Bar2() =0;
};

class Concrete : public IFoo
{
public:
  void Bar() { ... }
  void Bar2() { ... }
}

واجهات جاءت من علوم الكمبيوتر.أو دعنا نقول من الفطرة السليمة في البرمجة.الواجهة هي مجموعة منطقية من أساليب الفصل.C++ لا تحتاج إلى مفهوم اللغة المنفصلة من "الواجهة"، لأنه يمكن استخدام أي فئة كواجهة - ما عليك سوى تحديد مجموعة من الأساليب فيها، وعدم إجراء أي تطبيق، ثم تسميتها مثل IExecutable واستخدام:

class IExecutable
{
public:
    virtual void Execute() = 0;
};

class MyClass : public IExecutable
{
public:
    void Execute() { return; };
};

بعض اللغات، التي تسمى "مكتوبة ديناميكيًا"، مثل Python، لا تتطلب تحديد واجهات على الإطلاق، ما عليك سوى استدعاء الطريقة التي تحتاجها، والتحقق من وقت التشغيل إذا كان ذلك ممكنًا ("إذا كانت تمشي مثل البطة وتتحدث مثل بطة، يجب أن تكون بطة").

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

public interface IPurring
{
    void Purr();
}

public class Cat : Animal, IPurring
{
    public Cat(bool _isAlive)
    {
        isAlive = _isAlive;
    }

    #region IPurring Members

    public void Purr()
    {
        //implement purring
    }

    #endregion
}

على الرغم من أنها لا تسمى "واجهات"، إلا أن مؤشرات بنية بيانات لغة C مع مؤشرات الوظائف كعناصر في البنية طبقت مفهوم الواجهات قبل فترة طويلة من قيام لغة C++ بالفئات الأساسية الافتراضية IMO.

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

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

أعتقد أن الفكرة الأساسية هي "الميراث المتعدد".لذا جاءت الفكرة من لغة C++.

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