سؤال

أحاول أن يختتم يوما بعد يومين من الطرق المجردة ونوع المبيعات، لقد نشرت بالفعل سؤالين مماثلين وأنا ممتنين للأبد للمجتمع للحصول على المعلومات المقدمة، أنا فقط بحاجة إلى دفع آخر للوصول إلى خط النهاية. فيما يلي ما أحاول القيام به: 2 فصول مجردة، Recruiterbase و Candidesbase، كلاهما يحتوي على تطبيقات Concreate للمدينة والشديدة. يحتوي Recruiterbase على طريقة مجردة للحصول على جميع المرشحين المعينين الذين يعودون IQueryable. يتجاوز تنفيذي للتوظيف طريقة GetCandidate () لإرجاع IQueryable.

public abstract class RecruiterBase
{ 
  // Constructors declared here

  public abstract IQueryable<CandidateBase> GetCandidates();
}

public abstract class CandidateBase
{  
  // Constructors declared here
}

والمنامينات:

public class CandidateA : CandidateBase
{
  // Constructors declared here
}

public class RecruiterA : RecruiterBase
{
  // Constructors declared here

  // ----HERE IS WHERE I AM BREAKING DOWN----
  public override IQueryable<CandidateA> GetCandidates()
  {
     return from c in db.Candidates
            where c.RecruiterId == this.RecruiterId
            select new CandidateA
            {
              CandidateId = c.CandidateId,
              CandidateName = c.CandidateName,
              RecruiterId = c.RecruiterId
            };
  }
}

محاولة تشكيلها التي رمي خطأ في توقيت الترجمة لأنه في تطبيقي RecruitRebase، تتم إرجاع أسلوب GetCandidate () IQueryable<CandidateA> بدلاً من IQueryable<CandidateBase>.

بعد عدم القدرة على الحصول على اقتراحات من سؤال سابق (أنواع عودة عامة من الطرق التجريدية / الافتراضية) للعمل، لقد قمت بقراءة أكثر بكثير، واتبرت على السؤال التالي في ذلك

كيفية إرجاع النوع الفرعي في طريقة تجاوز الفئة الفرعية في C #؟

مما جعلني أخيرا أدرك ما كنت أبحث عنه هو وسيلة لتنفيذ التباين الصحي لنوع عودتي. لقد استخدمت Snippet Marc Gravell ...

abstract class BaseClass
{
    public BaseReturnType PolymorphicMethod()
    { return PolymorphicMethodCore();}

    protected abstract BaseReturnType PolymorphicMethodCore();
}

class DerivedClass : BaseClass
{
    protected override BaseReturnType PolymorphicMethodCore()
    { return PolymorphicMethod(); }

    public new DerivedReturnType PolymorphicMethod()
    { return new DerivedReturnType(); }
}

... كأساس للحل بلدي. حتى الآن تبدو فئات المجدد والجرعات المجددة:

public abstract class RecruiterBase
{
  // Constructors declared here

  public IQueryable<CandidateBase> GetCandidates()
  {
     return GetCandidatesCore();
  }

  public abstract IQueryable<CandidateBase> GetCandidatesCore();
}

وتنفيذي ...

public class RecruiterA : RecruiterBase
{
  // Constructors

  protected override IQueryable<CandidateBase> GetCandidatesCore()
  {
    return GetCandidates();
  }

  public new IQueryable<CandidateA> GetCandidates()
  {
    return from candidates in db.Candidates
           select new CandidateA
           {
             CandidateId = candidates.CandidateId,
             RecruiterId = candidates.RecruiterId
           };
  }
}

كنت آمل أن أحصل أخيرا على ما كنت أبحث عنه، لكنني حصلت على خطأ في توقيت الترجمة في التعليمات البرمجية التالية لأن GetCandidates () لا يمكن أن يحول بشكل ضمني Candidatea إلى CandidateBase:

  protected override IQueryable<CandidateBase> GetCandidatesCore()
  {
    return GetCandidates();
  }

لذلك أضفت ممثلين:

  protected override IQueryable<CandidateBase> GetCandidatesCore()
  {
    return ((IQueryable<CandidateBase>)GetCandidates());
  }

كل شيء ثم يجمع بعد ذلك عندما استدعاء getcandidates () في الواقع () في جهاز التحكم الخاص بي IQueryable<CandidateBase> بدلاً من IQueryable<CandidateA>. وبعد لذلك أنا على حق حيث بدأت.

إذا قمت بإنجائها طوال الطريق، فيمكنك مساعدتي سأرسل لك حزمة 12 من البيرة المفضلة لديك!

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

المحلول

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

إذا كنت طريقة مجردة هي من نوع العودة IQueryable<CandidateBase> ثم هذا ما ستحصل عليه. لا أرى مشكلة في هذا الأمر، نظرا لاحقا، لا يزال بإمكانك إلقاء ذلك candidatea. أو مرشد

فماذا تحاول بالضبط تحقيقه؟ ربما أنا لا أفهمك السؤال.

تحرير لإضافة:

جاستن، ماذا عن هذا؟

public abstract class RecruiterBase<T>
    {
        // Constructors declared here

        public abstract IQueryable<CandidateBase> GetCandidates();
    }

    public abstract class CandidateBase
    {
        // Constructors declared here
    }


    public class CandidateA : CandidateBase
    {

    }

    public class RecruiterA : RecruiterBase<RecruiterA>
    {
        // Constructors declared here

        // ----HERE IS WHERE I AM BREAKING DOWN----
        public override IQueryable<CandidateBase> GetCandidates()
        {
            return db.Candidates.Where(cand => cand.RecruiterId == this.RecruiterId)
                         .Select(x => new CandidateA
                                          {
                                             CandidateId = c.CandidateId,
                                             CandidateName = c.CandidateName,
                                             RecruiterId = c.RecruiterId
                                           })
                         .Cast<CandidateBase>()
                         .AsQueryable();
        }
    }

نصائح أخرى

أعتقد أن نواياك جيدة، ولكن النتيجة الصافية هي أنك تفتقد نقطة رمز متعدد الألوان وأيضا تفقد القيمة.

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

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

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