2008-10-20 7 views
4

En C#, est-il possible d'étendre une classe qui n'a pas de constructeur? Peut-être que je n'y pense pas correctement et que j'ai juste besoin d'un coup de pied à l'entrejambe. J'ai une classe Silverlight qui étend System.Windows.Media.Transform, Avec la version officielle de Silverlight 2, Transform n'a maintenant aucun constructeur. Donc, quand je compile ma classe, j'obtiens une erreur disant que 'le type' ... Transform 'n'a aucun constructeur défini.'Etendre la classe No-Constructor

Est-il encore possible d'étendre cette classe d'une manière utile? Sinon, je vais dessiner énormément de visages tristes.

Répondre

9

Le seul constructeur à Transformer est interne, vous ne pouvez donc pas en dériver vous-même.

+0

: (Voir que? C'est un début – MojoFilter

+0

WTF? Pourquoi ne pas simplement les sceller, paralysant comme ils l'ont fait pour les graphiques et autres classes connexes? – plinth

+0

Parce qu'ils devaient en dériver au sein de leur propre assemblée. –

0

Le masquage de tous les constructeurs publics est une technique utilisée pour empêcher le sous-classement et forcer les développeurs à utiliser la classe comme prévu. Il se peut que l'implémenteur veuille que vous utilisiez un adaptateur ou une façade ou même un proxy au moment de l'extension.

Il peut y avoir des détails importants sur le cycle de vie dans le constructeur qui nécessitent l'utilisation en tant qu'implémenteur d'origine, ou il peut s'agir d'un oubli de la part du développeur.

J'ai vu des tentatives de conversion au modèle Factory où ceci est fait d'une manière qui empêche le sous-classement. C'est à dire. il n'y a pas de constructeur protégé mis à la disposition des sous-classes. Parfois, les modèles d'objets avancés peuvent épuiser les capacités intégrées d'une langue.

0

Il est impossible qu'une classe n'ait aucun constructeur. Chaque classe a au moins un AFAIK. Si vous n'écrivez pas, le compilateur C# insérera un constructeur par défaut (sans paramètre) pour vous.

+0

Mais le constructeur par défaut n'a pas besoin d'être public. la classe elle-même peut y accéder, et si elle est interne, au moins aucun code externe ne peut y accéder – OregonGhost

+1

Il n'est pas impossible d'écrire une classe sans constructeur, à partir de C# 2: les classes statiques n'ont pas de constructeurs –

+0

(Et d'ailleurs, c'est toujours possible en IL.) –

0

Tant qu'il n'est pas scellé, vous devriez pouvoir l'allonger.

+0

Pas vrai, même dans le même assemblage - s'il n'a que des constructeurs privés (et que vous ne pouvez pas incorporer le nouveau type comme un type imbriqué), vous êtes foutu. Fondamentalement, le compilateur C# vous oblige à appeler un constructeur de base, donc vous devez être en mesure d'accéder à un ... –

+0

Vous avez raison. Si la classe définit explicitement un constructeur privé, alors le compilateur ne générera pas de constructeur par défaut. Mais je considérais "pas de constructeur" - ce qui signifie que le créateur de la classe n'a pas écrit un construtor. Ce qui voudrait dire que le compilateur va générer un constructeur par défaut. –

+0

Pas si c'est une classe statique - ils n'ont vraiment pas de constructeurs :) –

Questions connexes