2

次のように宣言された CAR というオブジェクトがあります。

public class Car{
   public int NumberOfWheels;
}  

別のクラスを使用して、そのサブクラスを 3 つ取得できます。
次のように:

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 から派生したクラスのみを受け取る必要があります。


(Javaジェネリックの ?? extends ? に相当するもの)

ありがとう。

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 に答える