7
votes

Utiliser un type pour instancier une classe dérivée qui utilise des génériques restreints

J'utilise une classe d'usine générique où la partie générique est la classe dérivée utilisée. L'utilisation normale est claire: BASECLASS C = NOUVELLE BASECLASS (). CODE> MAINTENANT J'essaye de mettre en place une injection de propriété dans la classe où j'utilise ces classes. Pour ce faire, j'ai essayé de donner du type comme un paramètre (afin que je puisse injecter quelle classe dérivée est utilisée).

Maintenant que je suis un peu à une perte malgré la recherche d'exemples et en essayant de moi. Et je me demande maintenant: une telle construction est-elle possible? Et si oui, comment puis-je instancier la classe et utiliser Existe et existez? P>

Utilisation: P>

public class DerivedA :BaseClass<DerivedA>
{
...
}

public class DerivedB :BaseClass<DerivedB>
{
...
   public bool ExistsB(string a) {...}
}


6 commentaires

Pourquoi ne faites-vous pas trop de mymainclass générique? Vous pouvez donc simplement passer à travers le type générique Param? Et vous auriez le type interne TypeAfe à la place de "objet".


@fildor pour être honnête, je n'ai pas pensé de cette façon jusqu'à présent (la "classe de mymainclass" est dans mon programme la logique commerciale d'un service Web et ne pensait pas à la direction de faire même qu'un générique, mais en toute honnêteté J'aime cette idée. )


Ce n'est pas clair ce que vous recherchez. Veuillez élaborer plus ou partager un pseudo code pour montrer quelle est votre exigence.


Je pense que vous êtes tellement emmêlé dans les modèles de conception que vous avez oublié de le garder simple. S'il vous plaît essayez de clarifier la question, ce n'est pas clair ce que vous demandez.


@Reza je ne suis pas sûr de ce que vous voulez dire. J'ai demandé comment je peux mieux instancier les classes, afin que je puisse utiliser existe et / ou existe (et aussi avoir une autocomplete pour leur montrer)


Je ne sais pas ce que vous demandez. Peut-être que vous pouvez donner vos exigences au lieu de votre conception. Je pense que peut-être que vous entrez dans le mauvais sens, le design est si complexe, mais votre question semble un peu simple. Il devrait y avoir un design simple et agréable.


4 Réponses :


1
votes

Est-ce ce que vous voulez? XXX


0 commentaires

4
votes

Vous pouvez créer une instance de tout type que vous passez avec ceci:

if (_ClassInstance is DerivedB derivedB)
    derivedB.ExistsB("...");


0 commentaires

0
votes

Je vous recommande d'utiliser gettype code> pour prendre un nom de type. Si vous avez nivelé l'héritage (hériter d'une autre classe de Derivedb, etc.), si vous utilisez gettype code>, vous pouvez être sûr que vous appelez cette méthode pour les instances des types de dérivés.

MyMainClass b = new MyMainClass(typeof(DerivedB));

if(b.GetType() == typeof(DerivedB)) 
b.ExistsB(...);


0 commentaires

0
votes

C'est le problème principal des classes abstraites - vous partagez l'interface et la mise en œuvre. Mais dans votre cas, vous dépendez fortement de différentes interfaces. Pour simplifier le problème, il suffit de regarder ce que vous voulez réellement:

IMainClass a = new CommonMainClass(new DerivedA());
IMainClass b = new ConcreteMainClass(new DerivedB());


0 commentaires