2

我有一个名为 CAR 的对象声明如下:

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. Car 没有构造函数。使用 {} 初始化。
3. 该方法应该只接收派生自 Car 的类,以便它可以使用其初始化 ( {} )。

(相当于 ?? extends ? in java generics)
可能吗?

谢谢。

4

3 回答 3

10
private static T GetTruck<T>(int param) where T : Car, new()
{
    return new T() {NumberOfWheels = param} ;
}
于 2013-02-03T11:40:06.060 回答
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() 
{...}
于 2013-02-03T11:40:13.953 回答
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 };
}
于 2013-02-03T11:43:34.563 回答