Pergunta

Eu tenho uma classe chamada "baseclass". A partir desta classe I herdar uma classe nomes "inheritedClass" (classe pública inheritedClass: baseclass)

O baseclass contém uma função pública que retorna um HashSet<baseClass>. Quando chamado a partir do inheritedClass, o tipo de retorno é, obviamente, ainda HashSet<baseClass>, mas eu preciso de um HashSet<inheritedClass>.

A ala de conversão (HashSet<inheritedClass>) returnValue, onde returnValue é do tipo HashSet<baseClass> não funciona.

Existe uma maneira de converter o HashSet-Type de baseclass para inheritedClass sem converter cada elemento manualmente?

Agradecemos antecipadamente, Frank

Foi útil?

Solução

Você realmente quer dizer C # nas tags? HashMap é um tipo Java. Também geralmente tem dois parâmetros de tipo em vez de um ...

Em C #, classes genéricas são sempre invariável. Alguns interfaces de irá ser variante em C # 4, mas muito poucos (apenas aqueles que ou única usar o parâmetro de tipo em uma positiion de saída, por exemplo IEnumerable<T> , ou única utilizar o parâmetro de tipo numa posição de entrada, por exemplo IComparable<T>).

Se você puder fornecer informações mais precisas sobre a sua situação, provavelmente vamos ser capazes de ajuda chegar a uma solução simples -. Especialmente se você pode usar LINQ com seu método Cast<T>()

EDIT: Ok, com HashSet<T>:

HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());

Note que, mesmo com C # 4 esta seria necessária porque o compilador não sabe que cada valor em baseSet é uma instância de DerivedType - tem de haver uma verificação em tempo de execução. O inverso (criando uma HashSet<BaseType> de um HashSet<DerivedType>) faria trabalho em C # 4.

editar mais: Se você só quer usar UnionWith, que não requer um HashSet<DerivedType> - requer uma IEnumerable<DerivedType>. Eu sugiro que você faça:

HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;

derivedSet.UnionWith(baseSet.Cast<DerivedType>());

Outras dicas

Aqui está a solução

//**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.}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top