باستخدام كائنات قاعدة كمعلمات في وظيفة عامة

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا أحاول لتنفيذ أسلوب مساعد باستخدام الأدوية (C # / 3.5) لقد هيكل جميل من الطبقات، مع فئات أساسية مثل ذلك:

public class SomeNiceObject : ObjectBase
{
  public string Field1{ get; set; }
}

public class CollectionBase<ObjectBase>()
{
  public bool ReadAllFromDatabase();
}

public class SomeNiceObjectCollection : CollectionBase<SomeNiceObject>
{

}

وأود أن إستعادة جمع باستخدام أسلوب عام مثل ذلك:

    public class DAL
    {

     public SomeNiceObjectCollection Read()
     {
      return ReadFromDB<SomeNiceObjectCollection>();
     }

     T ReadFromDB<T>() where T : CollectionBase<ObjectBase>, new()
     {
      T col = new T();
      col.ReadAllFromDatabase();
      return col;          
     }
   }

وهذا لا بناء، مع

Error   66  The type 'SomeNiceObjectCollection' cannot be used as type parameter 'T' in the generic type or method 'ReadFromDB<T>'.   There is no implicit reference conversion from 'SomeNiceObjectCollection' to 'CollectionBase<ObjectBase>'.

والكائن SomeNiceObjectCollection هو CollectionBase، وCollectionBase على وجه الدقة. فكيف يمكنني الحصول على هذا العمل؟

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

المحلول

وC # لا يدعم الصب بين أنواع القوائم (التغاير).

وأفضل رهان لدعم هذا النمط سيكون لتقديم واجهة للأسلوب ReadAllFromDatabase حتى انك لا تعتمد على جمع عام:

public class SomeNiceObject : ObjectBase
{
  public string Field1{ get; set; }
}

public interface IFromDatabase
{
  bool ReadAllFromDatabase();
}

public class CollectionBase<ObjectBase>() : IFromDatabase
{
  public bool ReadAllFromDatabase();
}

public class SomeNiceObjectCollection : CollectionBase<SomeNiceObject>
{

}

public class DAL
{

 public SomeNiceObjectCollection Read()
 {
  return ReadFromDB<SomeNiceObjectCollection>();
 }

 T ReadFromDB<T>() where T : IFromDatabase, new()
 {
  T col = new T();
  col.ReadAllFromDatabase();
  return col;          
 }
}

نصائح أخرى

في C # 3.0 لم يكن ذلك ممكنا، ولكن مع C # و. NET 4.0 مع لاتباين وتباين مرافق وتباين معاكس، وهذا قد يكون ممكنا.

ونفكر في ذلك، كنت تتناولين مجموعة تحتوي على كائن اشتقاق، ومحاولة التعامل معها مؤقتا كمجموعة من وجوه القاعدة. إذا سمح هذا، هل يمكن إدراج كائنات قاعدة في القائمة، التي لن يكون من وجوه مشتقة.

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

List<String> l = new List<String>();
List<Object> o = l;
l.Add(10); // 10 will be boxed to an Object, but it is not a String!
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top