テンプレートクラスのタイプの変換?
-
21-08-2019 - |
質問
私は「基本クラス」という名前のクラスを持っています。
:このクラスから、私はクラス名「inheritedClass」(基底クラスパブリッククラスinheritedClass)を継承します基底クラスはHashSet<baseClass>
を返すパブリック関数が含まれています。 inheritedClassから呼び出された場合、戻り値の型は明らかにまだHashSet<baseClass>
ですが、私はHashSet<inheritedClass>
を必要とします。
のreturnValueはタイプHashSet<inheritedClass>
である変換ALA(HashSet<baseClass>
)のreturnValueは、動作しない。
手動で各要素を変換することなくinheritedClassに基底クラスからHashSetの型に変換する方法はありますか?
事前のおかげで、 フランク
解決
あなたは本当にタグでのC#を意味していますか? HashMap
は、Javaの型です。また、それは一般的に持っている2種類のパラメータではなく、1 ...
C#では、ジェネリッククラスは常に不変です。 の一部のインタフェースはをがのみの、出力positiionタイプパラメータを使用し、例えばIEnumerable<T>
いずれものみ(C#4での変異体であるが、非常に少ないであろう、またはののみの)例えばIComparable<T>
、入力位置に型パラメータを使用します。
あなたがあなたの状況についてのより正確な情報を提供できる場合、我々は、おそらく簡単な解決策を考え出す助けることができるでしょう - 。あなたはそのCast<T>()
メソッドでLINQを使用することができ、特に場合は、
EDIT:さて、HashSet<T>
付きます:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
実行時のチェックがなければならない - コンパイラはbaseSet
内のすべての値がDerivedType
のインスタンスであることを知らないためにもC#4で、これは必要であろうことに注意してください。 C#4において逆(HashSet<BaseType>
からHashSet<DerivedType>
を作成)希望の作業
FURTHER EDIT:あなただけUnionWith
を使用したい場合は、HashSet<DerivedType>
を必要としない - それはIEnumerable<DerivedType>
が必要です。私はあなたが提案します:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
他のヒント
ここでは解決策があります。
//**Your BaseClass**
public class BaseClass<T> where T : BaseClass<T>
{
public HashSet<T> GetHashSet()
{
HashSet<T> _hSet = new HashSet<T>();
//do some work
//create a HashSet<T> and return;
return _hSet;
}
}
//**Your Inherited/Derived Class**
public class InheritedClass : BaseClass<InheritedClass>
{
//you have the method inherited as you need.}
}