2009-06-20 112 views
2

我有接口:C#子類返回一個未知類型(futher:來自親本)

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

簡單的類與此梅託德

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

和父類這樣的:

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

我想返回子類中的設置metod的父類型 這是可能的嗎? 我需要做這樣的事情:

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這個類的功能是相同的只有返回類型不同勢

回答

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

編輯:這是更好地移動接口實現了基類的馬克說:

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> )並且有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> { } 
0

好,如果我使用了通用基礎類,我不能投父類的一種類型, 我不知道爲什麼我試圖使用通用的有...我發現解決方案現在:)

THX的幫助

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