كيف تقوم بتصفية مجموعة من الكائنات في فئة أساسية تعتمد على نوع الفئة الفرعية التي تم إنشاؤها؟

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

سؤال

كتبت هذا المثال للمساعدة في شرح. كما ترون أن لدي تسلسل هرمي كائن. أرغب في تعديل وظيفة GetFeatures () لإرجاع الميزات المضافة فقط بواسطة منشئ نوع الكائن I مثيل. على سبيل المثال، يجب أن تقوم BasicModel.getFeatures (New Luxurymodel ()) فقط بإرجاع الميزات "المقاعد الجلدية" و "فتحة السقف". لا مانع من استخدام التفكير إذا كان علي ذلك.

Public Class Feature

    Public Sub New(ByVal model As BasicModel, ByVal description As String)
        _model = model
        _description = description
    End Sub

    Private _model As BasicModel
    Public Property Model() As BasicModel
        Get
            Return _model
        End Get
        Set(ByVal value As BasicModel)
            _model = value
        End Set
    End Property

    Private _description As String
    Public Property Description() As String
        Get
            Return _description
        End Get
        Set(ByVal value As String)
            _description = value
        End Set
    End Property

End Class


Public Class BasicModel
    Public Sub New()
        _features = New List(Of Feature)
    End Sub

    Private _features As List(Of Feature)

    Public ReadOnly Property Features() As List(Of Feature)
        Get
            Return _features
        End Get
    End Property

    Public Shared Function GetFeatures(ByVal model As BasicModel) As List(Of Feature)
        'I know this is wrong, but something like this...'
        Return model.Features.FindAll(Function(f) f.Model.GetType() Is model.GetType())
    End Function
End Class


Public Class SedanModel
    Inherits BasicModel

    Public Sub New()
        MyBase.New()
        Features.Add(New Feature(Me, "Fuzzy Dice"))
        Features.Add(New Feature(Me, "Tree Air Freshener"))
    End Sub
End Class


Public Class LuxuryModel
    Inherits SedanModel

    Public Sub New()
        MyBase.New()
        Features.Add(New Feature(Me, "Leather Seats"))
        Features.Add(New Feature(Me, "Sunroof"))
    End Sub
End Class
هل كانت مفيدة؟

المحلول

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

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

على سبيل المثال، يمكنك تقسيم خاصية الميزات إلى خصائصين، قل modelfeatures و Allfeatures.

Modelfeatures محددا للنموذج الحالي ("المقاعد الجلدية" و "فتحة السقف" للحصول على Luxurymodel، إلخ. هذا يجعل الحصول على ميزات النموذج الحالي وصول إلى خاصية تافهة.

PS الرجاء أن يغفر أخطاء VB الخاصة بي، C # هو Lang المفضلة لدي.

نصائح أخرى

أنا لست على دراية بخلايا VB.NET، لذلك هنا هو بناء جملة C # الذي يجب أن يعمل:

public IList<Function> GetFeatures(BasicModel model)
{
    return model.Features.Where(f => f.Model.GetType() == model.GetType()).ToList();
}

(بناء على التعليمات البرمجية الخاصة بك أعلاه)

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

سأكون أكثر ميلا جدا لوضع بياناتك الثابتة حيث تنتمي، (في هذه الحالة) مع فئة الميزات نفسها. أنا لست رجل VB لذلك هذا الرمز مقتطف في ج #.

لذلك في فئة الميزات نفسها، لديك ثابتة الممتلكات (أو الطريقة)

public static IEnumerable<Feature> GetLuxuryFeatureSets
{
  get
  {
    yield return new Feature() { Name = "Leather Seats" };
    yield return new Feature() { Name = "Sunroof" };
  }
}

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

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

public class LuxuryModel
{
  public LuxuryModel
  {
     Features.Add( GetFeatures() );
  }
  public List<Features> GetFeatures()
  {
     return new List<Features>( /* new up leather and whatever */
  }
}

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

public List<Features> GetFeatures<T>( BasicModel model )
{
   var m = Model as T;
   return m.GetFeatures();
}

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

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

  public class BasicModel
  {
    public virtual IEnumerable<Feature> GetFeatures 
    {
      get
      {
        throw new NotImplementedException();
      }
    }
  }


  public class LuxuryModel :BasicModel
  {
    public override IEnumerable<Feature> GetFeatures
    {
      get
      {
        yield return new Feature() { Name = "Leather Seats" };
        yield return new Feature() { Name = "Sunroof" };
      }
    }
  }



private void button1_Click(object sender, EventArgs e)
{
  StringBuilder sb = new StringBuilder();

  BasicModel bm = new LuxuryModel();

  foreach (Feature f in bm.GetFeatures)
  {
    sb.AppendLine(f.Name);
  }
  MessageBox.Show(sb.ToString());
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top