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 Réponses :
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 ..
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
.
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; }
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
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
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 :)
Vous pouvez définir une
interface code >
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.