Ich bemerkte , dass mit den optionalen Parameter in C # 4 , wenn Sie einen optionalen Parameter für eine Schnittstelle geben Sie don t haben , um diesen Parameter optional auf jeder implementierenden Klasse zu machen:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
und deshalb:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Weiß jemand, warum optionale Parameter so funktionieren?
Einerseits denke ich, dass die Möglichkeit, alle auf den Schnittstellen angegebenen Standardwerte zu überschreiben, nützlich ist. Um ehrlich zu sein, bin ich mir nicht sicher, ob Sie überhaupt Standardwerte auf der Schnittstelle angeben können sollten, da dies eine Implementierungsentscheidung sein sollte.
Andererseits bedeutet diese Trennung, dass Sie die konkrete Klasse und die Schnittstelle nicht immer austauschbar verwenden können. Dies wäre natürlich kein Problem, wenn der Standardwert in der Implementierung angegeben wird. Wenn Sie jedoch Ihre konkrete Klasse als Schnittstelle verfügbar machen (z. B. mithilfe eines IOC-Frameworks, um die konkrete Klasse einzufügen), gibt es wirklich keine Punkt mit dem Standardwert, da der Anrufer ihn trotzdem immer angeben muss.
MyInterface
und mit dem optionalen Parameter aufrufen : ((MyInterface)obj).TestMethod();
.