C # الدرجة الطفل عودته نوع غير معروف (futher: من الأم)

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي واجهة:

public interface Inx<T>
{
   T Set(Data data);
}

وفئة بسيطة مع هذا ميتود

public class Base
{
   ??? Set(Data data) { ... }
}

ووالفئة الأصل من هذا القبيل:

public class Parent : Base, Inx<Parent>
{
   ...
}

وأريد أن أعود نوع الرئيسي من مجموعة ميتود في الصف الطفل انه ممكن ؟ أنا في حاجة إليها القيام به لشيء من هذا القبيل:

list.Add(new Parent().Set(data));

والآن لا بد لي من القيام بما يلي:

T t = new T();
t.Set(data);
list.Add(t);

وعلى مزعج قليلا، لا بد لي من استخدامها الكثير من الوقت


وآسف لspaming جيدا هم يمكنني استخدام شيء من هذا القبيل:

this.GetType().GetConstructor(new System.Type[] { typeof(Data) }).Invoke(new object[] { data })

وsoluction ذلك ربما الجيد هو إرجاع كائن من هذه الطريقة.؟ \

وفئة عامة بشكل جيد مع واجهة عامة يبدو نكون النفايات ذاكرة كبيرة ... beacose وظيفة من هذه الفئة هي نفس نوع الإرجاع الوحيد هو ديفرينت

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

المحلول

هل هذا ما تريد؟

interface Inx<T> { 
    T Set(Data data);
}
public class Base
{
    public virtual T Set<T>(Data data)
    {
        T t = default(T);
        return t;
    }
}
public class Parent : Base, Inx<Parent>
{
    public Parent Set(Data data)
    {
        return base.Set<Parent>(data);
    }
}
class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set<Parent>(data));
        // or 
        list.Add(new Parent().Set(data));
    }
}

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

interface Inx<T> { 
    T Set(Data data);
}
public class Base<T> : Inx<T>
{
    public virtual T Set(Data data)
    {
        T t = default(T);
        return t;
    }
}
public class Parent : Base<Parent>
{        
}
class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set(data));            
    }
}

نصائح أخرى

والطريقة الوحيدة التي يمكن ان نفعل ذلك سيكون لجعل Base عام (Base<T>) ويكون Set عودة T - بعد ذلك Parent : Base<Parent>. المشكلة هي ... كيف Set معرفة كيفية إنشاء T؟ هل يمكن أن يكون شرط where T : new() ...

ومفيد جانبا هنا هو أنه يمكنك نقل تطبيق واجهة في Base<T>:

public class Base<T> : Inx<T> where T : new()
{
   public T Set(Data data) {
       T t = new T();
       ///
       return t;
   }
}
public class Parent : Base<Parent> { }

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

وتشك للمساعدة

interface Inx
{
   object Set(Data data);
}
class Base
{
   object Set(Data data)
   {
      // ...
      return (object) this;
   }
}
class Parent: Base, Inx
{
   // i don't have too write here Set (im using from base one)
}
class ManageParent<T> where T: Inx, new()
{
   // ...
      list.Add((T) new T().Set(data));
   // ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top