Question

J'ai une classe de base (mal écrite) à intégrer dans un objet proxy. La classe de base ressemble à la suivante:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   public BaseClass(int someValue) {}

   //...more code, not important here
}

et mon proxy ressemble à:

public BaseClassProxy : BaseClass
{
  public BaseClassProxy(bool fakeOut){}
}

Sans le "fakeOut" constructeur, le constructeur de base devrait être appelé. Cependant, avec cela, je m'attendais à ce qu'il ne soit pas appelé. Quoi qu'il en soit, j'ai besoin d'un moyen de ne pas appeler les constructeurs de la classe de base ou d'un autre moyen de remplacer efficacement cette classe (perverse).

Était-ce utile?

La solution

Si vous n'appelez pas explicitement de constructeur dans la classe de base, le constructeur sans paramètre sera appelé implicitement. Il n'y a pas moyen de contourner cela, vous ne pouvez pas instancier une classe sans appeler un constructeur.

Autres conseils

Il existe un moyen de créer un objet sans appeler aucun constructeur d'instance .

Avant de continuer, assurez-vous de vouloir le faire de cette façon. 99% du temps c'est la mauvaise solution.

Voici comment vous le faites:

FormatterServices.GetUninitializedObject(typeof(MyClass));

Appelez-le à la place du constructeur de l'objet. Il va créer et vous renvoyer une instance sans appeler de constructeur ni d’initialiseur de champ.

Lorsque vous désérialisez un objet dans WCF, cette méthode est utilisée pour créer l'objet. Lorsque cela se produit, les constructeurs et même les initialiseurs de champs ne sont pas exécutés.

Au moins 1 acteur doit être appelé. Le seul moyen de contourner ce que je vois est le confinement. Avoir la classe à l'intérieur ou référençant l'autre classe.

Si vous voulez ne pas appeler , aucun des deux constructeurs de classe de base, vous ne pouvez pas le faire.

Les constructeurs de classe C # doivent appeler les constructeurs de classe de base. Si vous n'en appelez pas explicitement un, base () est impliqué . Dans votre exemple, si vous ne spécifiez pas le constructeur de la classe de base à appeler, il est identique à:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base() { }
}

Si vous préférez utiliser l'autre constructeur de la classe de base, vous pouvez utiliser:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base(someIntValue) { }
}

Dans les deux cas, l'un des deux centres sera appelé (explicitement ou implicitement).

Je ne crois pas que vous puissiez contourner l'appel du constructeur. Mais vous pouvez faire quelque chose comme ça:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   protected virtual void Setup()
   {
   }
}

public BaseClassProxy : BaseClass
{
   bool _fakeOut;
   protected BaseClassProxy(bool fakeOut)
   {
        _fakeOut = fakeOut;
        Setup();
   }

   public override void Setup()
   {
       if(_fakeOut)
       {
            base.Setup();
       }
       //Your other constructor code
   }
} 

Lorsque vous créez un objet BaseClassProxy, il est NÉCESSAIRE de créer une instance de sa classe de base. Vous devez donc appeler le constructeur de la classe de base. Pour ce faire, vous devez choisir celui à appeler, par exemple:

public BaseClassProxy (bool fakeOut) : base (10) {}

Pour appeler le deuxième constructeur au lieu du premier

Je crains que le constructeur non appelant de base ne soit pas une option.

J'ai fini par faire quelque chose comme ça:

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

Cela m'a permis de contourner certaines des mauvaises pratiques de la classe de base.

Les constructeurs sont publics par nature. n'utilisez pas de constructeur et utilisez-en un autre pour la construction et rendez-le privé. Pour créer une instance sans paramètre, appelez cette fonction pour construire votre instance d'objet.

Très bien, voici une solution laide au problème d’une classe qui hérite des constructeurs d’une autre classe et que je ne voulais pas laisser certaines d’entre elles fonctionner. J'espérais éviter d’utiliser ceci dans ma classe mais le voici:

Voici le constructeur de ma classe:

public MyClass();
{
   throw new Exception("Error: Must call constructor with parameters.");
}

D'accord, vous avez été prévenu que c'était moche. Aucune plainte s'il vous plaît!

Je voulais forcer au moins les paramètres minimaux de mon constructeur principal sans lui permettre de créer le constructeur de base hérité sans paramètres.

Je crois aussi que si vous créez un constructeur et ne mettez pas le: base () après cela, il n'appellera pas le constructeur de la classe de base. Et si vous créez des constructeurs pour tous ceux dans la classe de base et fournissez les mêmes paramètres exacts dans la classe principale, qu’elle ne passera pas. Mais cela peut être fastidieux si vous avez beaucoup de constructeurs dans la classe de base!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top