2010-07-15 17 views
3

Je veux personnaliser le comportement d'un objet avant la création de l'objet. Je pense que peut-être ajouter des crochets dans le constructeur de l'objet et faire le changement, il y aurait un choix. Y a-t-il un moyen de le faire dans .net? Merci beaucoup d'avance!comment ajouter un hook dans le processus de création d'objet dans .net

EDIT:

est un exemple ici:

Supposons que nous avons un enfant de classe qui utilisent la méthode Exécuter pour obtenir un crédit dans la classe.

public class Kid 
{ 
    public void Perform() { ... } 
} 

et la conduite de l'école à des conférences:

public class School 
{ 
    public void Chemistry() { 
     // The school have a good chemistry teacher, so every kid study well 
     // Kid.Perform() is modified to reflect that 
     Kid tom = new Kid(); 
     tom.Perform(); 
    } 

    public void Biology() { 
     //This class is boring, everyone will nap in 5~10 min 
     // Kid.Perform() use a random number to simulate how 
     //long this kid can hold it. 
     Kid tom = new Kid(); tom.Perform(); 
     Kid jerry = new Kid(); jerry.Perform(); 
    } 
} 

Nous voulons que chaque enfant effectuer de la même manière et je ne veux pas:

  1. Change Kid de classe, car il est généré à partir un outil tiers et largement utilisé ailleurs.
  2. Utilisez l'héritage.
+0

Pourriez-vous donner quelques exemples de ce que vous voulez dire en personnalisant le comportement des objets? Si vous voulez instancier plusieurs fois la même classe avec une différence comportementale particulière, alors passer un délégué en tant que paramètre constructeur est une option? –

+0

Je modifie le code existant, et je veux spécifier comment l'objet sera créé. Après cela, toute la création d'objet suivra cette règle. – Roy

+0

Que voulez-vous dire par "comment l'objet va être créé?" Pouvez-vous ne pas changer le code dans le constructeur de la classe? –

Répondre

3

Dans votre cas, vous devrez ajouter votre logique après avoir appelé le constructeur. Vous pourriez écrire une méthode d'usine qui fait ceci; le remplacement new SpecialObject() avec MyExtendedSpecialObject.Create() ne devrait pas être trop difficile.

public static class MyExtendedSpecialObject 
{ 
    public static SpecialObject Create() 
    { 
     var newObject = new SpecialObject(); 

     // Do something with newObject 

     return newObject; 
    } 
} 
+0

Oui, beaucoup de gens utilisent la méthode d'usine. Mais je modifie le code existant. et une voie "d'injection" est préférée. – Roy

+0

@Roy: Une simple recherche et le remplacement ne devrait pas être trop difficile. AFAIK une telle injection que vous voulez n'est pas possible (sauf peut-être à travers quelque chose comme la programmation orientée aspect?). –

0

Vous ajouteriez simplement la logique au constructeur de l'objet. Si vous faites référence au processus d'accrochage dans l'allocation de mémoire, alors ce n'est pas disponible dans .NET.

public class MyClass 
{ 
    public MyClass() 
    { 
     // Constructor logic here... 
    } 

    public MyClass(string name) 
    { 
     // Overloaded constructor logic here... 
    } 
} 
+0

L'objet est généré par un outil tiers. Envelopper la classe peut résoudre mon problème mais signifie beaucoup de travaux de refactoring dont je ne suis pas si satisfait. Y a-t-il d'autres choses? Merci! – Roy

+0

Eh bien, dans la même veine, vous pouvez utiliser une méthode d'extension pour fournir une méthode 'Initialize', mais cela serait fonctionnellement similaire à l'envelopper. –

0

Vous pouvez utiliser System.Activator pour créer les instances. Vous pouvez également «accrocher» l'activateur et effectuer vos vérifications.

+0

cela ne fonctionnera pas, le demandeur ne contrôle pas le code de création, sinon il pourrait simplement utiliser sa propre usine. –