8
votes

Créez une instance de classe générique à partir de la méthode statique dans une classe dérivée

J'ai une classe en C # avec un modèle et une méthode statique similaire à xxx pré>

à partir de là, je dérive une classe et spécifiez un paramètre de modèle à la classe de base p>

BClass<int> d = DClass.Create();


0 commentaires

3 Réponses :


8
votes

Il semble que ce que vous voulez, c'est pour dclass code> pour être un alias pour bclass code>. Mais ce n'est pas ce que vous avez ici. Ce que vous avez, c'est que dclass code> dérive de fort> bclass code>. Ainsi appelant dclass.create (); code> crée un bclass code>, qui est pas em> a dclass code> (c'est l'inverse).

Cela pourrait le rendre plus clair. Supposons que vous ayez eu cette hiérarchie: p> xxx pré>

une option pour obtenir quelque chose comme la fonctionnalité que vous souhaitez peut-être définir votre méthode code> Créer code> P>

static TClass Create<TClass>() where TClass : BClass<T>, new() {
    return new TClass();
}

// code elsewhere
var shape = DClass.Create<DClass>();


0 commentaires

1
votes
class BClass<T>
    {
        public static T1 Create<T1, T2>() where T1 : BClass<T2>, new()
        {
            return new T1();
        }
    }

    class DClass : BClass<int> { }

    class Program
    {
        static void Main(string[] args)
        {
            DClass d = DClass.Create<DClass, int>();
        }
    }

0 commentaires

7
votes

oui, il est possible fort>, en ayant une référence de type au type lui-même. Notez que dans le monde .Net, nous parlons de génériques, pas de modèles, qui ont des différences importantes dans leur travail.

class BClass<T, TSelf> where TSelf: BClass<T, TSelf>, new() {
    public static TSelf Create() {
        return new TSelf();
    }
}

class DClass: BClass<int, DClass> {}

class Program {
    static void Main(string[] args) {
        DClass d = DClass.Create();
    }
}


8 commentaires

Vous ne savez pas qu'une classe pourrait se réfuser en tant que paramètre de type dans sa superclasse? Paradoxe au poulet et aux œufs ou quelque chose ...


Intelligent et un peu bizarre! ;) Le seul inconvénient que je vois ici est qu'il semble qu'il n'y ait jamais de moyen d'instancier un ancien Bclass , comme dans le code d'origine de l'OP.


@Peter, j'en ai réellement utilisé cette réussite beaucoup. Par exemple, il vous permet également de créer une meilleure méthode de clone car elle élimine la nécessité de refouler, etc.


@Dan Tao, à droite, qui ne fonctionne essentiellement que pour les classes "abstraites" qui sont ensuite héritées.


@LUCERO, c'est assez cool. Devinez que c'était similaire à ce que j'ai essayé auparavant, myClass: isomegenericinterface ... ce qui ne fonctionne pas :)


@Peter, MyClass: IsomegenericInterface fonctionne bien pour moi. Vous devez avoir essayé autre chose. ;)


@LUCERO - OCH ... homme, qu'est-ce que c'était alors ?? Peut-être myClass : t . Tant pis :)


C'est une bonne réponse, mais notez que si vous avez une autre classe Eclass: DCLASS , puis eclass.create () retournera un dclass instance , pas une instance eclass , qui peut ou non être un problème.