2017-01-05 17 views
1

私は以下のクラスがあります。このような構造を使用して峠ジェネリック型まで継承ツリー

abstract class Foo<T>
abstract class BaseClass : Foo<BaseClass>
class DerivedOne : BaseClass
class DerivedTwo : BaseClass

Foo<BaseClass>からBaseClass継承から派生するすべてのクラスを。私はDerivedOneに、私はクラスがFoo<DerivedOne>になりたいけどDerivedTwoに、私はクラスがFoo<DerivedTwo>から派生したい、例えば各派生クラス

の異なるTのジェネリック型を設定できるようにしたいです。

汎用タイプを継承ツリーに渡す方法はありますか?

私はこのようなことを試みました(これはうまくいかない)。

abstract class Foo<T>
abstract class BaseClass<T> : Foo<T>
class DerivedOne : BaseClass<DerivedOne>
class DerivedTwo : BaseClass<DerivedTwo>

編集:ここでは、実際のコードサンプルです:彼らはジェネリック型

編集#2として自分自身に渡していることを示すためにジェネリック型を変更しました私が使っているクラス:

public abstract class DBObject<T> 
    where T : DBObject<T>, new() 
{ 
    //the generic type is for this method, so I can create an object from a database query 
    public static T Create(DataRow dataRow) 
    { 
     Type T = MethodBase.GetCurrentMethod().DeclaringType; 
     T obj = new T(); 

     foreach (var field in obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) 
     { 
      if (dataRow.Table.Columns.Contains(field.Name)) 
      { 
       Object safeObj = Convert.ChangeType(dataRow[field.Name].ToString(), field.FieldType); 
       field.SetValue(obj, safeObj); 
      } 

     } 

     foreach (var field in obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) 
     { 
      Console.WriteLine(field.Name + "=" + field.GetValue(obj)); 
      //propInfo.SetValue(obj, value, null); 
     } 
     return obj;    
    } 
} 

public abstract class Contact<T> : DBObject<T> 
    where T : Contact<T> 
{ 
    //field and methods ommitted... 
} 

public class Person : Contact<Person> 
{ 
    //fields and methods ommitted... 
} 

public class Company : Contact<Company> 
{ 
    //fields and methods ommitted... 
} 

回のクラスは、その後、このような方法で使用することができます。

Person person = Person.Create(/* DataRow from a query result */); 
+0

あなたは完璧な作品を与えた例では、それはおそらく何か他のもので、なぜあなたはそれが –

+1

動作しないと言うんおそらく、あなたは '抽象クラスBaseClassのをしたいですか? –

+0

@Nobody次のエラーが表示されます。 'タイプ' T 'は、汎用タイプまたはメソッド' Foo 'のタイプパラメータ' T 'として使用できません。 'T'から 'Foo ' 'へのボクシング変換や型パラメータ変換はありません。 '' T'はジェネリックでパラメータ 'T'として使用するためにパブリックパラメータなしコンストラクタを持つ非抽象型でなければなりませんタイプまたはメソッド「フー」 ' – yitzih

答えて

1

私はあなたがContact<T>new()制約を追加した場合、コンパイルするためにあなたのコードを取得する:

public abstract class Contact<T> : DBObject<T> 
    where T : Contact<T>, new() 
{ 
    //field and methods ommitted... 
} 

これはgeneric constraints aren't inherited以降が必要です。 Fooの T:Bar`

関連する問題