هل يمكنك مساعدتي فهم في مثال عملي على استخدام فئات مجردة مقابل واجهات?

StackOverflow https://stackoverflow.com/questions/627199

  •  06-07-2019
  •  | 
  •  

سؤال

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

لتوضيح المشروع كما فعلت حتى الآن هو أدناه.ليس لدي الكلب/القط الطبقات الخ تنشأ بعد.هل يمكن أن تعطيني مؤشر.أنا لا أطلب أي شخص أن تعطيني إجابات"." أنا فقط فقدت بشأن أين تذهب مع هذا.كنت تأخذ دورات على الانترنت و له جهود التواصل معي كانت مثيرة للقلق.لقد انتهيت للتو مع 4.0 مع كل ما عندي من الدورات الأخرى, لذلك أنا على استعداد لوضع الجهد ولكن أنا فقدت في فهم هذه المفاهيم و كيفية تطبيقها عمليا لهم.

أي تعليقات أو المساعدة التي تسمح لي مزيد من التقدم في هذا المشروع ؟

وصف ما أنا لتنفيذ هي على النحو التالي:

نظرة عامة:

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

إذا كنت بنجاح إكمال المهمة الخاصة بك البرنامج الناتج البيانات التالية عند تشغيل:

اسمي بقعة أنا كلب

اسمي فيليكس أنا القط

المتطلبات:

1) يجب أن يكون لديك قاعدة مجردة فئة تسمى "الحيوانات" التي الكلب والقط الطبقات اشتقاق.

2) الحيوان الفئة الأساسية يجب أن تستمد من واجهة 'IAnimal ، الطبقة الوحيدة التي ينبغي أن تستمد من IAnimal.

3) لأن كل الحيوانات لها اسم اسم ليس سمة محددة إلى كلب أو قطة, الحيوان

الفئة الأساسية يجب أن يكون فيها اسم يتم تخزين فيها WhatIsMyName الحصول على العقار تنفيذها.

4) سوف تحتاج إلى إنشاء كلب القط الفئة التي سوف تستمد فقط من الحيوان الفئة الأساسية.

5) الكلب و القط أن الطبقات تنفيذ WhatAmI الحصول على الممتلكات ، عودة المناسبة سلسلة القيمة.

رمز لا يمكنك تغيير:

using System;

namespace IT274_U2
{
    public interface IAnimal
    {
        string WhatAmI { get; }
        string WhatIsMyName { get; }
    }

    public class TesterClass
    {
        public static void DescribeAnimal(IAnimal animal)
        {
            Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
        }

        static void Main(string[] args)
        {
            Dog mydog = new Dog("Spot");
            Cat mycat = new Cat("Felix");
            DescribeAnimal(mydog);
            DescribeAnimal(mycat);
        }
    }
}

///////////////////////

مدونة لقد كتبت حتى الآن:

using System;


namespace IT274_U2
{
    public interface IAnimal
    {
        string WhatAmI { get; }
        string WhatIsMyName { get; }
    }


    public class Dog
    {
        public abstract string WhatAmI
        {
            get;
            set;
        }
    }//end public class Dog

    public class Cat
    {
    public abstract string WhatIsMyName  
    {
        get;
        set;
    }
    }//end public class Cat

    public abstract class Animal : IAnimal
    {
    // fields
    protected string Dog;
    protected string Cat;

                  // implement WhatIsMyName 

    //properties
    public abstract String Dog
    {
        get;  
        set;
    }
    public abstract String Cat
    {
        get;
        set;
    }
    public abstract string WhatIsMyName();

    } //end public abstract class Animal


    public class TesterClass
    {
        public static void DescribeAnimal(IAnimal animal)
        {
            Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
        }

        static void Main(string[] args)
        {

            Dog mydog = new Dog("Spot");
            Cat mycat = new Cat("Felix");
            DescribeAnimal(mydog);
            DescribeAnimal(mycat);
        }
    }
}
هل كانت مفيدة؟

المحلول

تحرير:

لقد اتخذت الجسم من رمز لكل فئة من - إذا كنت تريد أن ترى جوابي إلقاء نظرة على تعديل التنقيحات :)

أولا نحدد واجهة

public interface IAnimal
{
    string WhatAmI { get; }
    string WhatIsMyName { get; }
}

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

ونحن بحاجة إلى تحديد مجردة الحيوان الدرجة

public abstract class Animal : IAnimal
{
    //Removed for Training, See Edit for the code
}

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

الآن, دعونا نحدد موقعنا Cat و Dog دروس

public class Dog : Animal
{
    //Removed for Training, See Edit for the code
}

public class Cat : Animal
{
    //Removed for Training, See Edit for the code
}

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

بقية الكود

public class Program
{
    public static void DescribeAnimal(IAnimal animal)
    {
        Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI);
    }

    static void Main(string[] args)
    {
        Dog mydog = new Dog("Spot");
        Cat mycat = new Cat("Felix");
        DescribeAnimal(mydog);
        DescribeAnimal(mycat);
        Console.ReadKey();
    }
}

أسلوب ثابت DescribeAnimal يقبل IAnimal كحجة ويكتب بها القيم التي يتم إرجاعها من قبل WhatIsMyName و WhatAmI accessors الخاصية من أجل مرت في IAnimal.

منذ Animal تنفذ IAnimal و كل Dog و Cat ترث من Animal, أي Cat أو Dog الكائن يمكن تمريره كمعلمة إلى DescribeAnimal الأسلوب.

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

نصائح أخرى

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

وأنا لن تقوم بأداء واجبك بالنسبة لك، ولكن تلميحا: الطبقة الحيوانية يجب أن لا تحتوي على أي شيء محدد للكلاب والقطط

وأنت قريب، ولكن جعل هذا أكثر صرامة مما يجب أن يكون.

وأنا لا أريد أن أقدم لكم الجواب؛) ولكن هنا بعض المؤشرات

أولا، كنت تقوم بإنشاء 3 فئات و 1 واجهة. ومع ذلك، فإن شيئا واحدا أعتقد أنك قد تكون في عداد المفقودين هو أن تحتاج إلى 3 أنواع مختلفة من الكائنات هنا (من "ما لا يقل عن تعريف" إلى "أكثر محددة"):

1) واجهة
  هذا هو IAnimal - ويمكن تنفيذها من قبل أي شيء يمكن أن تتصرف مثل حيوان

2) خلاصة الدرجة قاعدة   هذا هو CALSS الحيوان - كل ما هو حيوان يجب أن تنبع من الحيوان، ولكن هذه ليست creatable مباشرة. إذا كنت أدعي أنك الله، لا تجعل الحيوان، وجعل لكم الكلب، القط، السنجاب، أو FuzzyBunny

و3) تنفيذ الخرسانة الحيوان   هذه هي الطبقات الفعلية نفسها. هذا هو ما تقوم بإنشائها. الكلب أو القط في قضيتك.

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

عموما:

  • أحد واجهات لوصف أساليب كائن سوف تستجيب.بل هو عقد الكائن يرتكب لتلبية.

  • فئات مجردة يصف الوظائف الأساسية والسماح المتخصصة وظائف فرعية.

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

و يمكنك استخدام فئة مجردة عندما تحتاج إلى أن يكون إصدارات متخصصة من بعض الصف.

دعونا نقول كنت ترغب في إنشاء نظام فيها أي نوع من الكائن قد يكون التعرف على هوية فريدة من نوعها, و لا يهمك الطبقة التي ينتمون إليها.

قد يكون لديك:

  • الحيوانات

  • النقل

  • الأدوات الكمبيوتر.

  • أيا كان.

لأنها مواضيع لا علاقة لها ، يمكنك اختيار وتنفيذ واجهة, دعونا نقول:

public interface IIdentifiable 
{ 

      public long GetUniqueId();
}

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

public class IPod: IIdentifiable 
{
      public long GetUniqueId() 
      {
           return this.serialNum + this.otherId;
      }
}

public class Cat: IIdentifiable 
{
      public long GetUniqueId()
      { 
           return this.....
      }
}

كلا و آي بود و قطة جدا طبائع مختلفة ولكن كلاهما قد يستجيب إلى "GetUniqueId()" الطريقة التي سيتم استخدامها في الكتالوج النظام.

ثم قد يكون استخدام مثل هذا:

    ...

    IIdentifiable ipod = new IPod(); 
    IIdentifiable gardfield = new Cat();

    store( ipod );
    store( gardfield );


    ....
    public void store( IIdentifiable object )  
    {

         long uniqueId = object.GetUniqueId();
        // save it to db or whatever.
    }

من ناحية أخرى, قد يكون لديك فئة مجردة تحديد كل مشترك سلوك الكائن ، والسماح فرعية تحدد إصدارات متخصصة.

  public abstract class Car 
  {
       // Common attributes between different cars
       private Tires[] tires; // 4 tires for most of them 
       private Wheel wheel; // 1 wheel for most of them.

        // this may be different depending on the car implementation.
       public abstract void move(); 
  }


  class ElectricCar: Car 
  {
      public void move()
      {
         startElectricEngine();
         connectBattery();
         deploySolarShields();
         trasnformEnertyToMovemetInWheels();
      }
  }

  class SteamCar: Car 
  {     
       public void move() 
       {
          fillWithWather();
          boilWater();
          waitForCorrectTemperature();
          keepWaiting();
          releasePreasure....
        }
   }

هنا نوعين من السيارات, تنفذ "التحرك" طريقة في طرق مختلفة, أنها لا تزال حصة الأشياء المشتركة في الفئة الأساسية.

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

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

// حالة 1 ...كل فئة فرعية تنفذ واجهة

   public class ElectricCar: Car, IIdentifiable 
   {
       public void move()
       {
         .....
       }
       public long GetUniqueId() 
       { 
         ....
       }
   }

   public class SteamCar: Car, IIdentifiable 
   {
       public void move()
       {
         .....
       }
       public long GetUniqueId() 
       { 
         ....
       }
  }

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

   public abstract class Car: IIdentifiable 
   {
       // common attributes here
       ...
       ...
       ...



       public abstract void move();
       public long GetUniqueId()
       {
          // compute the tires, wheel, and any other attribute 
          // and generate an unique id here.
       }
   }

   public class ElectricCar: Car
   {
       public void move()
       {
         .....
       }
   }

   public class SteamCar: Car
   {
       public void move()
       {
         .....
       }
  }

آمل أن يساعد هذا.

  1. واجهة هو العقد.هذا هو المكان الذي تريد أن تصف الوظائف سوف توفر ، من دون أي تفاصيل التنفيذ

  2. فئة مجردة هي فئة هدفها هو تبادل تفاصيل التنفيذ بين الطبقات الفرعية.بما انه هنا فقط من أجل تقاسم الرموز/factorisation الأغراض لا يمكن إنشاء مثيل

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

لنكون صادقين أنه يخيفني كمية من الناس في هذه الصناعة التي لا أعرف هذا بغض النظر عن ما إذا كان هو السؤال الواجب المنزلي أو لا. لذلك سأجيب.

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

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

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

ومثال بسيط هو IDataStore. مخزن البيانات SavingToATextFile هو مجرد الفئة التي تطبق IDataStore. ومع ذلك MsSqlDataStore وMySqlDataStore سوف تشارك رمز مشترك. وسوف ترث كلا من SqlDataStore فئة مجردة الذي ينفذ IDataStore.

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

واجهات:

واجهة ليست فئة، ولها تعريف الأساليب.

وهناك فئة يمكن inheirt واجهات متعددة ولكن واحدة فقط فئة مجردة.

وآمل أن يساعد

وفي الأساس، واجهة وتعرف على "عقد" (أي مجموعة من العمليات / خصائص) أن جميع منفذي يجب أن تقدم. في هذه الحالة يتطلب واجهة IAnimal خصائص WhatAmI وWhatIsMyName. قد توفر فئات مجردة وظيفة معينة، ولكن سوف تغادر أيضا بعض العمليات التي يجب أن تنفذ من قبل الفئات الفرعية الخاصة بهم.

في حالة المثال الخاص بك، الفئة الأساسية الحيوانات قادرة على توفير وظائف WhatIsMyName منذ 'اسم' هو ملك كل الحيوانات. ومع ذلك، فإنه لا يمكن أن توفر خاصية "WhatAmI، منذ فقط فرعية محددة تعرف ما نوع 'هم.

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

واقتراح آخر - (تخرج عن الموضوع قليلا، ولكن لا تزال ذات الصلة)

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

وعلى سبيل المثال، بدلا من القيام:

class SomeClass
{
   public string MyProperty
   {
       get;
       set;
   }
}

وحاول تنفيذ هذا بنفسك:

class SomeClass
{
    public string MyProperty
    {
        get
        {
             return "MyValue"; // Probably a private field
        }
        set
        {
             // myField = value; or something like that
        }
}

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

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