2016-12-03 16 views
0

だから、私はこのコードを持っている:私のプログラムでは、ジェネリックメソッド内で子クラスコンストラクタを呼び出すことは可能ですか?

public class Fruit { 
    public Fruit() { 
     // base class constructor 
    }    
} 
public class Apple: Fruit { 
    public Fruit(): base() { 
      // child class constructor 
    } 

} 


T MakeNew<T>(T item) where T: Fruit, new() { 

    T tempNewClass = new T(); 
    return tempNewClass; 

} 

そしてを:

Apple apple = new Apple(); 
Apple anotherApple = MakeNew<Apple>(apple); 

anotherAppleは、アップルのクラスであるが、私のメソッド内で作成中、唯一の基本コンストラクタが呼び出されるのはなぜあたかも基本クラスとして扱われたかのように?

私は推測しているのは、メソッドのinit行にnew()キーワードがあるからです。

ジェネリックメソッド内に子クラスを作成し、そのコンストラクタを呼び出す方法はありますか?

PS:私はC#を学んでいて、インターネットから必要なすべての回答を得るために全力を尽くしています。私は今4日以来、この問題に悩まされており、どこにいても答えが見つからなかった。しかし、私は間違っている可能性があります、多分私は間違った質問をしていますか?

答えて

0

このeavenはコンパイルされますか?私はそれがなければならないようAppleコンストラクタがFruitコンストラクタの後に呼び出されます、それをデバッグする場合

public class Apple: Fruit { 
    public Fruit(): base() { 
     // child class constructor 
    } 
} 

はそれが

public class Apple: Fruit { 
    public Apple(): base() { 
     // child class constructor 
    } 
} 

すべきではありません。

別のオプションは、

T MakeNew<T>() where T : Fruit, new() 
{ 
    var instance Activator.CreateInstance<T>(); 
    //Do stuff with instance 
    return instance: 
} 

だろうそして、あなたはまた、あなたのパラメータT itemが必要な場合、あなたは再びそれを追加することができます。

0

サブクラスの前に常に基本クラスのコンストラクタが呼び出されていることに気づくかもしれません。以下のコードを実行して行動を観察してみてください。

static void Main(string[] args) 
    { 
     Console.WriteLine("new Apple()"); 
     Apple apple = new Apple(); 

     Console.WriteLine(); 

     Console.WriteLine("MakeNew<Apple>(apple)"); 
     Apple anotherApple = MakeNew<Apple>(apple); 
    } 

    static private T MakeNew<T>(T item) where T: Fruit, new() 
    { 
     return new T(); 
    } 
    public class Fruit 
    { 
     public Fruit() 
     { 
      Console.WriteLine("Fruit Constructor"); 
     } 
    } 

    public class Apple : Fruit 
    { 
     public Apple() : base() 
     { 
      Console.WriteLine("Apple Constructor"); 
     } 
    } 
} 
関連する問題