2009-06-20 8 views
2

у меня есть интерфейс:класс # ребенок C возвращает неизвестный тип (тендера: от родителей)

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

простой класс с этим Metod

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); 

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


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

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

, так что, возможно, хорошая совпадение возвращает объект из этого метода; \?

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

ответ

0

Является ли это то, что вы хотите?

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)); 
    } 
} 

EDIT: Это лучше перенести реализацию интерфейса до класса Base, как Марк сказал:

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));    
    } 
} 
5

Единственным способом вы могли бы сделать, что бы сделать Base родовых (Base<T>) и получите SetT - тогда у нас 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> { } 
0

хорошо, если я использую общий базовый класс я не могу бросить родительский класс к одному типу, я не знаю, почему я пытался использовать родовое там ... я нашел решение сейчас :)

ТНХ помощь

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)); 
    // ... 
}