2013-02-03 103 views
2

調用基類的構造我有一個名爲CAR對象聲明如下:C#泛型方法 - 在一個類型

public class Car{ 
    public int NumberOfWheels; 
} 

,並使用另一個類我可以檢索其三個子類。
如下:

public TruckA getCarA(int param){ 
    return new TruckA() {NumberOfWheels = param} 
} 
public TruckB getCarB(int param){ 
    return new TruckB() {NumberOfWheels = param} 
} 
public TruckC getCarC(int param){ 
    return new TruckC() {NumberOfWheels = param} 
} 

我怎樣寫在使用泛型? (我知道它太簡單了,我需要一個更復雜的案例)

我想創建一個方法,創建一個新的(T),輸入參數並返回它。

public TruckC getCarC(int param){ 
    return getTruck<TruckC>(param) 
} 

只有:
1. TruckA/B/C不具有構造函數。
2.汽車沒有構造函數。使用{}初始化。
3.該方法應該只接收從Car派生的類,以便它可以使用它的初始化({})。

(在java泛型中相當於擴展的東西)
可能嗎?

謝謝。

+2

谷歌泛型類型約束。 – antonijn

+2

'1。 TruckA/B/C沒有構造函數。 2.汽車有一個構造函數(我假設不是無參數的)。「這是不可能的。 –

+0

@HamletHakobyan作者遺漏了TruckX定義,因此您不知道它是否具有無參數構造函數。但顯然它有,因爲他稱之爲 – deej

回答

9
private static T GetTruck<T>(int param) where T : Car, new() 
{ 
    return new T() {NumberOfWheels = param} ; 
} 
+1

@rails完成的你有沒有試過這個1. TruckA/B/C沒有構造函數。 2.汽車有一個構造函數(公共汽車(int param))? –

+0

@HamletHakobyan:解決方案有效。但感謝您注意我的錯誤。在我的真實代碼中,我使用{}進行初始化,並且成員是私有的。我在我的問題中更新了這個錯誤。 – Jeb

1

試試這個:

public T getCarC<T>(int param) where T : Car, new() 
     { 
      T truck=new T(); 
      truck.NumberOfWheels = param; 

      return track; 
     } 

泛型是C#2.0中最強大的功能。泛型允許您定義類型安全的數據結構,而無需承諾實際的數據類型。

當從通用基類派生,你必須提供一個類型參數,而不是基類的泛型類型參數:

public class BaseClass<T> 
{...} 
public class SubClass : BaseClass<int> 
{...} 

如果子類,而不是一個具體的類型參數一般, ,你可以使用子類泛型類型參數作爲通用基礎類的指定類型:

public class SubClass<T> : BaseClass<T> 
{...} 

當使用子類泛型類型參數,必須在子類級別重複在基類級別規定的任何約束。例如,衍生約束:

public class BaseClass<T> where T : ISomeInterface 
{...} 
public class SubClass<T> : BaseClass<T> where T : ISomeInterface 
{...} 

或構造函數約束:

public class BaseClass<T> where T : new() 
{ 
    public T SomeMethod() 
    { 
     return new T(); 
    } 
} 
public class SubClass<T> : BaseClass<T> where T : new() 
{...} 
1

你需要做到這一點使用泛型類型的限制。這些讓你對傳遞的類型提出了要求。

這將是這個樣子:

public static T GetCar<T>(int param) 
    where T : Car, new() // Must inherit from Car, must have a parameterless constructor 
{ 
    return new T() { NumberOfWheels = param }; 
} 
相關問題