1
votes

Surcharge de méthode C # sans réécriture de contenu

J'ai plusieurs classes, mais toutes ont une variable avec le même type et le même nom. Ensuite, j'ai une méthode qui prend la valeur de la variable que j'ai mentionnée avant, et la traite de la même manière quel que soit le type d'entrée.

Voici un exemple:

int foo(A input),foo(B input),foo(C input) { return input.i*2; }


4 commentaires

Vous pouvez définir une interface et utilisez-le comme type de paramètre pour la méthode: public interface IHaveNumber {int i {get; ensemble; }} public int Foo (entrée IHaveNumber) {...}


@germi Je pense qu'avec c # 8, vous pouvez même avoir des implémentations par défaut dans une interface. L'inconvénient est que cela va à l'encontre de ce qu'une interface est censée être.


@EpicKip c'est vrai, mais je préfère ne pas pointer un débutant vers cela, car c'est assez déroutant comme ça (même pour les personnes plus expérimentées).


@germi Totalement d'accord. Je connais l'existence mais je refuse de l'utiliser car cela ajoute de l'imprévisibilité pour les autres lorsqu'ils lisent mon code. OMI une interface doit seulement être un contrat et ne pas avoir d'implémentation. Je suggérerais aux gens d'utiliser une classe de base s'ils le souhaitent.


4 Réponses :


1
votes

créez une classe parent avec la méthode foo (), puis créez les classes A, B, C qui héritent de cette classe parente ..


0 commentaires

5
votes

Le moyen le plus simple et le plus idiomatique serait de définir un interface comme ceci:

public class A { public int i { get; set; } }
public class B : A { }
public class C : A { }

public int Foo(A input){ ... }

Une autre possibilité est d'avoir (par exemple) B et C dérive de A et définit Foo comme prenant la classe de base:

public interface IHaveNumber //or whatever you want to call it
{
    int i { get; set; } // I would propose a better name for this...
}

public int Foo(IHaveNumber input)
{
    //whatever ...
}

public class A : IHaveNumber
{
    public int i { get; set; }
}

En général, je pense que ce serait utile de consulter la documentation concernant polymorphisme et héritage .


0 commentaires

1
votes

Vous pouvez utiliser une classe de base dont vos autres classes hériteraient alors

Par exemple:

Base.cs

public int Calculate(Base base)
{
   return base.i * 2;
}


2 commentaires

ok merci pour votre aide :)) je peux utiliser cela dépend parfois de la situation


Pas de problème, je suppose que cela pourrait être utile dans les cas où la méthode ne fait pas partie de la classe elle-même



2
votes

Que diriez-vous de créer une classe abstraite comme celle-ci:

A aInstance = new A() { input = 10 };
aInstance.foo();

Et d'autres classes comme celle-ci:

class A: Calculate {       
    public override int input { get ; set ; }
}
class B : Calculate
{
    public override int input { get; set; }
}
class C : Calculate
{
    public override int input { get; set; }
}

Maintenant vous ne le faites pas besoin de passer quoi que ce soit pour faire le même travail, appelez simplement la méthode comme suit:

public abstract class Calculate
{
    public abstract int input { get; set; }
    public virtual int  foo() { return input * 2; }
}

Vous pouvez vérifier ceci exemple également pour référence d'utilisation


1 commentaires

Merci pour l'aide ! bien que je ne connaisse pas encore une partie du code parce que je suis un débutant en c #, mais en regardant le code de près, je comprends ce que fait le code. Merci :)