Ich habe bemerkt, dass mit den optionalen Parametern in C# 4, wenn Sie einen optionalen Parameter auf einer Schnittstelle angeben Sie nicht, dass müssen diesen Parameter für jede implementierende Klasse optional 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 auf diese Weise funktionieren sollen?
Einerseits nehme ich an, dass die Möglichkeit, alle in den Schnittstellen festgelegten Standardwerte außer Kraft zu setzen, nützlich ist, obwohl ich mir ehrlich gesagt nicht sicher bin, ob man überhaupt in der Lage sein sollte, Standardwerte in der Schnittstelle festzulegen, da dies eine Entscheidung der Implementierung sein sollte.
Auf der anderen Seite 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 ist, aber wenn Sie Ihre konkrete Klasse als Schnittstelle offenlegen (z. B. mithilfe eines IOC-Frameworks, um die konkrete Klasse zu injizieren), dann hat es wirklich keinen Sinn, den Standardwert zu haben, da der Aufrufer ihn sowieso immer bereitstellen muss.