2009-11-18 226 views
0

我對泛型相當陌生,而且我在理解部分工作方式方面遇到了一些麻煩,並且無法按照自己的方式工作。通用類型,使用接口的不同泛型類型?

到目前爲止,我有這個;

public interface IObjectMapper 
{ 
    T MapObject<T>() where T : new(); 
} 

public class CustomObjectMapper : IObjectMapper 
{ 
    T IObjectMapper.MapObject<T>() 
    { 
     T retObject = new T(); 
     //do stuff...... 
    } 
} 

這工作正常,但我不明白「T:new()」在做什麼。有人可以解釋嗎?此外,對於我的第二個問題 - 我想要第二個方法稱爲DemapObject,它接受2個參數,來自對象的同一個泛型類型T,然後不同泛型類型的U - U也應該是返回類型。

public interface IObjectMapper 
{ 
    T MapObject<T>() where T : new(); 
    U DemapObject<T, U>() ??????? what goes here? 
} 

最後,一旦我得到DemapObject的接口方法完成 - 它是如何從實現類中調用的?

public class CustomObjectMapper : IObjectMapper 
{ 
    NameValueCollection IObjectMapper.DempaObject<T, NameValueCollection>() 
    { 
     //is this right???????????? 
    } 
} 

回答

1

where T: new()要求作爲T任何類型應該實現默認(參數的構造函數) 。否則就不可能創建一個T類的實例。

對於你的最後一個問題:你不能做一個通用方法的專門實現。但是你可以做一個專門的接口實現。考慮一下:

public interface IObjectMapper<U> where U:new 
{ 
    T MapObject<T>(U arg) where T:new() 
    U DemapObject<T>(T arg); 
} 
public class CustomObjectMapper : IObjectMapper<NameValueCollection> 
{ 
    T MapObject<T>(NameValueCollection arg) where T:new(){ 
     .... 
    } 

    NameValueCollection DemapObject<T>(T arg) 
    { 
      .... 
    } 
} 


IObjectMapper<NameValueCollection> mapper = new CustomObjectMapper(); 

而我還沒有理解你的第二個問題,你能否詳細說明一下?

+0

我不確定我是否正確地問了這個問題,但看着你的代碼,我想你已經解決了它。我試圖創建一個映射對象的接口 - 有點像ORM的東西。 因此,基本上DemapObject方法將採用一個通用對象並去除它的值,將它們填入返回類型並將其吐出。 因此,一個實現可能具有返回類型的DataTable用於DemapObject,而另一個實現可能具有返回類型NameValueCollection。然而,另一個可能會返回一個字符串,其中包含所有值,以便查詢字符串。 – WesleyJohnson 2009-11-18 07:34:44

2

「其中T:」將在T上設置約束。在這種情況下的約束是「new()」。這意味着泛型類型T必須有一個不帶參數的構造函數。

可以疊加,其中在同類型的條款:

class MyClass<T> where T : class, new() { } 

或不同的類型:

class MyClass<T,U> 
    where T : class, new() 
    where U : IMyInterface 
    { 
    } 
+0

+1部分和如此快速地回答。謝謝! – WesleyJohnson 2009-11-18 07:44:34