سؤال

لست متأكدًا من أنه سؤال "تعدد الأشكال" حقًا ولكن على أي حال ...إذن لدي فصل تجريدي وفئتان أخريان ورثتا منه.

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

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

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

public abstract class BaseAbstract class {

  ... some code ....

  // Here "listName" would change depending on the extending class
  protected List<Items> getAllItems(String listName) {

    Web.getList(listName);

    ... some code ...

  }

  protected abstract List<Items> getAllItems();

}

public class NewClass : BaseAbstract {
 protected override void getAllItems() {
    return getAllItems("ListNameOfNewClass");
 }
}

هذه هي الطريقة التي قمت بها، لكن ليس من الواضح حقًا أو من السهل الحفاظ على IMO.

أي فكرة أو تعليق موضع ترحيب!

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

المحلول

وربما كنت تختار لشيء من هذا القبيل:

public abstract class Base
{
    protected abstract string ListName { get; }
    public List<Item> GetItems()
    {
        return Web.GetList(ListName);
    }
}

public class Child : Base
{
    protected override string ListName
    {
        get { return "MyListName"; }
    }
}

نصائح أخرى

يفضل تركيب أكثر من الميراث.

public class Base {
  private ItemListGetter itemListGetter; // assignment/initialization is up to you

  private List<Items> getAllItems() {  // this can now be inlined
    return itemListGetter.getList();
  }

}

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

وربما سأذهب للنهج التالي:

public abstract class Base
{
    protected List<Items> getAllItems(String listName) 
    {
        // Implementation
    }

    public abstract List<Items> Items
    {
        get;
    }
}

public class NewClass : Base
{
    public override List<Items> Items
    {
        get
        {
            return base.getAllItems("ListNameOfNewClass");
        }
    }
}

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

ولقد تغيرت واجهة ويتعرض كخاصية بحتة من الخنزير الصلابة! والحزب فقط في حال كنت لم أعلم أنه يمكن القيام به ...

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

وعلى سبيل المثال:

class test
{
    protected string listName;

    protected void getAllItems() 
    {
        return getAllItems(listName);
    }
}

class test2 : test
{
    public test2()
    {
        base.listName = "MyUniqueList";
    }
}

وأعتقد أنه سيكون أكثر منطقية تنفيذ المكون الثالث:

    public abstract class BaseClass {

        protected abstract IList<Item> getAllItems();
    }

    public class SubClass : BaseClass 
    {
        IItemsProvider itemsProvider;

        protected override IList<Item> getAllItems() 
        {
            return itemsProvider.getAllItems("filter");
        }
    }

    public interface IItemsProvider
    {
        IList<Item> getAllItems(string name);
    }

إذا كنت تريد حقًا الحصول على الميراث، فسأختار ذلك ctacke's حل.

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

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