définir la méthode d’interface avec différents parameters en C #

interface parentInterface { public Ssortingng methodA(/*define parameters name and dataType*/); } 

et

 public class childA : parentInterface { public Ssortingng methodA(Ssortingng a, int b, Ssortingng c, long d){} } public class childB : parentInterface { public Ssortingng methodA(int e, Ssortingng f, Ssortingng g){} } 

Je veux définir le nom des parameters et le type de données de la méthode d’interface

Vous avez deux méthodes différentes

 public Ssortingng methodA(Ssortingng a, int b, Ssortingng c, long d){} 

et

 public Ssortingng methodA(int e, Ssortingng f, Ssortingng g){} 

qui représentent respectivement deux contrats différents pour childA et childB. Vous ne pouvez pas définir une interface avec une seule methodA qui convient aux deux définitions. Ce que vous cherchez à faire n’est pas possible.

Notez que vous pouvez définir les deux surcharges dans votre interface, mais chaque classe implémentant cette interface devra implémenter les deux surcharges.

Faire un nouveau paramètre

Cela peut souvent être résolu en utilisant une class ou une struct à utiliser en tant que paramètre unique plutôt que les types intégrés.

L’interface

Vous savez à quoi s’attendre d’une class lorsqu’elle implémente une interface familière. Nous soaps que toutes les classes implémentant l’interface IEnumerable peuvent être utilisées dans une boucle foreach . Par convention, le nom de l’interface est “I” suivi de la description d’une capacité. Il est typique que le nom se termine par le suffixe “-able”.

suffixe formable formant des adjectifs signifiant:
1 -able d’être [comme dans] calculable.
2-avoir la qualité de [comme dans] à l’aise.

Dictionnaire anglais d’oxford

parentInterface et MethodA() pour donner un exemple clair de la façon dont cela fonctionne normalement (et pour éviter les sanctions négatives):

 public interface ITreatable { Treatment GetTreatment(); } 

Bien, trouver le remède peut ne pas être aussi facile, même si l’ object représente une maladie traitable. Voici quelques exemples:

 public class TheFlu : ITreatable { public Treatment GetTreatment(int year) { // return some object, Treatment, based on the flu season. } } public class Hangover : ITreatable { public Treatment GetTreatment() { return Treatment.Empty; // no parameters necessary. } } public class Insomnia : ITreatable { public Treatment GetTreatment(FamilyHistory occurances, LabResult lab) { // return Some Treatment object that can be different based on the // calculated risk from the arguments. } } 

Ce qui nous manque vraiment ici

Je ne connais pas la biologie, mais le concept est toujours le même. Vous avez un groupe d’objects maladie ITreatable qui doivent avoir une méthode GetTreatment() ; Cependant, ils utilisent des critères différents pour effectuer les calculs. Nous avons besoin de Symptoms .

 public class Symptoms { public FamilyHistory History; public DateTime Time; public LabResult Lab; public BloodTest BloodTest; public TimeSpan SymptomTime; public IsCritical IsCritical; } 

Maintenant, les objects peuvent parsingr les symptômes selon leur propre méthode et notre interface ressemblera à ceci:

 public interface ITreatable { Treatment GetTreatment(Symptoms symptoms); } 

Vous pouvez utiliser une méthode d’interface avec un nombre variable d’arguments à l’aide du mot clé params . Mais vous devez ensuite convertir chaque argument dans le type approprié, ce qui est sujet aux erreurs de bits.

 public interface IFoo { void DoWork(params object [] arguments); } public class Foo : IFoo { public void DoWork(params object [] arguments) { ssortingng a = (ssortingng)arguments[0]; int b = (int)arguments[1]; ssortingng c = (ssortingng)arguments[2]; long d = (long)arguments[3]; Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a,b,c,d); } } public class AnotherFoo : IFoo { public void DoWork(params object [] arguments) { int e = (int)arguments[0]; ssortingng f = (ssortingng)arguments[1]; ssortingng g = (ssortingng)arguments[2]; Console.WriteLine("e={0}, f={1}, g={2}", e,f,g); } } void Main() { var foo = new Foo(); foo.DoWork("a",1, "c",2L); var foo1 = new AnotherFoo(); foo1.DoWork(1,"f", "g"); } 

Les méthodes avec des parameters différents ne peuvent pas implémenter la même déclaration de méthode d’interface. Si la signature de votre méthode ne correspond pas à celle de l’interface, vous ne l’implémentez pas.

Vous pouvez y parvenir, mais ce n’est pas une bonne conception car l’interface ne vous dit rien sur la méthode:

 interface parentInterface { ssortingng methodA(params object[] asd); } public class childA : parentInterface { public ssortingng methodA(params object[] p) { ssortingng a = p[0] as ssortingng; int b = (int)p[1]; ssortingng c = p[2] as ssortingng; long d = (long)p[3]; return ssortingng.Empty; } } public class childB : parentInterface { public ssortingng methodA(params object[] p) { int e = (int)p[0]; ssortingng f = p[1] as ssortingng; ssortingng g = p[2] as ssortingng; return ssortingng.Empty; } }