2011-08-16 12 views
0

は、私は次のコード初期化と範囲の一般的な抽象クラス

  var dataCollection; 
      if (ViewBag.WageType.ToLower() == "perm") 
      { 
       dataCollection = ViewBag.PermWageIndex; 
      } 
      else if(ViewBag.WageType.ToLower() == "trial") 
      { 
       dataCollection = ViewBag.TrialWageIndex; 
      } 

戻り値の型がAbstractClass<Concrete1>またはAbstractClass<Concrete2>することができています。私は宣言でvarを初期化する必要があります。しかし、これは私が望む範囲を失うことを意味します。 ViewBagに依存せずに動的なDataCollectionを許可するには、このコードを変更するにはどうすればよいですか?

+0

メソッド(またはそのクラスを含む)を汎用にすることはできませんか?そして、少しの文脈でアドバイスをするのは難しいです。 'AbstractClass'とは何ですか? 「コンクリート1」と「コンクリート2」の間には何らかの関係がありますか?結果はどのように使用されますか? – svick

+0

@svick - 私はそれらの質問に答えるためにかなりのデザインを説明しなければならないでしょう。私はこれが問題を解決するのに十分な情報であることを期待しています。それはないかもしれません... –

答えて

2

AbstractClass<>にインターフェイスIAbstractClassを実装させ、それを共通タイプにすることができます。

これが動作するかどうかは、戻り値の型がアクセスする必要のあるメンバーによって異なります。明らかに、一般的に型付けされたメンバーを参照することはできませんが、とにかくそれはあまり意味がありません。消費者が一般的なパラメータがどういうものなのかを知るべきではないと仮定しているからです。

+0

+1ああ、もちろんあなたは正しいです。消費者(ビュー)は、コントローラーではなく、問題を処理すべきです。それは簡単に解決することができます。 –

2

これを解決する唯一の方法は、あなたがAbstractClass<ISomething>としてdataCollectionを宣言することができConcrete1Concrete2によって実装継承される基本クラスやインターフェイスを/提供することです。

Varは動的な型指定ではなく、コンパイル時に解決されます。したがって、コンパイラは型を推論できないため、代入なしで変数を宣言することはできません(var x;)。

あなたはobjectまたはdynamicにフォールバックすることができます。

関連する問題