C # дочерний класс, возвращающий неизвестный тип (далее: от родителя)

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>
{
   ...
}

я хочу вернуть родительский тип из метода Set в дочерний класс Возможно ? Мне нужно это сделать, чтобы что-то подобное:

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

Теперь я должен сделать это:

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

И это немного раздражает, я должен использовать это много раз

<Ч>

Извините за хороший спам, хм, я могу использовать что-то подобное:

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

так что, возможно, хорошее решение - вернуть объект из этого метода; \?

хорошо универсальный класс с универсальным интерфейсом кажется большой тратой памяти ... потому что функции этого класса такие же, только возвращаемый тип diffrent

Это было полезно?

Решение

Это то, что вы хотите?

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>. Проблема в том ... как where T : new() узнать, как создать <=>? Вы можете иметь предложение <=> ...

Полезно отметить, что вы можете переместить реализацию интерфейса в <=>:

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