C# zwei Interfaces mit je einer Methode mit dem gleichen Namen?

...komplette Frage anzeigen

3 Antworten

Beispiel:

using System;

public interface A{
void Foo();
}

public interface B{
void Foo();
}

public class C:A,B{
public void Foo(){
Console.WriteLine(this);
}
}

public class Test{
public static void Main(string[] args){
new C().Foo();
}
}

Gibt zumindest an sich keinen Fehler. Weder vom Compiler noch zur Laufzeit.

ABER: Wenn man z.B. 2 verschiedene APIs verwendet, die zufälligerweise in ihrem Interface eine Methode mit gleicher Signatur verwenden, könnte es Probleme geben, wenn die implementierte Methode mit einer davon nicht kompatibel ist...

Meiner Ansicht nach kann es da überhaupt keine Probleme geben, denn:

Ein Interface sagt ja nur, welche Methoden welcher Signatur eine ein Interface implementierende Klasse haben muss. 

In diesem Fall ist die Aussage, die Klasse C:A,B müsse eine Methode void foo() implementieren, halt einfach in beiden Interfaces gegeben. Sie widersprechen einander nicht.

Probiere mal aus, was passiert, wenn die beiden Interfaces A und B für foo() unterschiedlichen Returntype fordern. Das dürfte eigentlich nicht gut gehen.

0
@grtgrt

Bei unterschiedlichen Rückgabewerten muss die Methode explizit über die Schnittstelle implementiert werden, also beispielsweise so

int B.Foo()
{
return -1;
}
0
@CrystalixXx

Und um mein Beispiel daran anzupassen:

using System;

public interface A{
int Foo();
}

public interface B{
char Foo();
}

public class C:A,B{
int A.Foo(){
return 42;
}
char B.Foo(){
return 'X';
}
}

public class Test{
public static void Main(string[] args){
C c = new C();
Console.WriteLine(((A)c).Foo());
Console.WriteLine(((B)c).Foo());
}
}
0

Soweit ich weiß, gibt das keinen Fehler.

Um sicherzugehen kannst Du die Interfaces explizit implementieren:

public void Interface1.Methode() {...}

public void Interface2.Methode() {...}

Dann kannst Du auch Unterschiedliches implementieren.

Kein Fehler. Du kannst sie sowohl zusammen, als auch getrennt implementieren.

Was möchtest Du wissen?