1

この質問の私のタイトルを説明したいと思います。

私は基本クラスを持っています

 public class BaseClass { /* stuff */ }

そして継承する他の2つのクラスBaseClass

  public class Test1: BaseClass {  ... }

  public class Test2: BaseClass { ... }

それでは、ジェネリッククラスを想定してみましょう(私のプロジェクトでは非常に複雑です)

  public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2

BaseClass場合によっては、それ以外の場合Test1またはのみを使用する必要がありますTest2

私は機能を持っています:

  public int Create ( T obj){
    if( obj is Test1) { return aManager.Create((Test1)obj); } // the cast is OK
    else if(obj is Test2) { return bManager.Create((Test2)obj);}  // error cast
  }

私も持っていaManager.Create (Test1 obj)ますbManager.Create(Test2 obj)

elseキャストにエラーがあるのはなぜですか?

私の間違いはどこですか?

PS : との間で順序を変更するTest1Test2、最初ifにキャスト エラーが発生し、inelseは問題ありません。

4

2 に答える 2

0

ジェネリック型の制約がどのように機能するかを誤解していると思います。まず、あなたの質問に答えることから始めましょう。

実際には、このような署名のみが必要です。

public GenericClass<T> : IBase<T> where T: BaseClass

つまり、型 T は、型 BaseClass または BaseClass 自体から派生した任意の型です。

タイプ BaseClass、Test1、および Test2 のすべてのインスタンスを非常にうまく受け入れます。

さらに、コードの改善を提案したいと思います..

public int Create ( T obj){
    if( obj is Test1) { return aManager.Create(obj as Test1); } // the cast is OK
    else if(obj is Test2) { return bManager.Create(obj as Test2);}  // error cast
  }

ただし、コードの設計にはいくつかの抜け穴があると思います。コンテキストをより詳細に説明できれば、問題に対するより優れた設計ソリューションが得られる可能性があります。仕事に間違ったツールを使用しているように見えるので、これはジェネリックよりも設計に関係していると思います。

于 2013-03-29T11:32:07.527 に答える
0

Test1と の両方Test2がクラスである限り、この行は正しくありません。

public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2

ジェネリック型の制約で許可される基本クラスは 1 つだけであり、それを最初の制約として指定する必要がありますが、複数のインターフェイス型を制約として持つことができます。これを見る

私が何を意味するかを確認するには、次のCreateようにメソッドを変更すると、エラーが表示されます。

public int Create ( T obj)
{
//if( obj is Test1) { return aManager.Create((Test1)obj); } // the cast is OK
//else if(obj is Test2) { return bManager.Create((Test2)obj);}  // error cast
    return 1;
}
于 2013-03-29T08:01:13.360 に答える