Zauważyłem, że przy opcjonalnych parametrach w C # 4, jeśli podasz opcjonalny parametr w interfejsie, którego nie używasz , musisz uczynić ten parametr opcjonalnym dla dowolnej klasy implementującej:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
i dlatego:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Czy ktoś wie, dlaczego parametry opcjonalne zostały zaprojektowane w taki sposób?
Z jednej strony przypuszczam, że możliwość przesłonięcia wartości domyślnych określonych w interfejsach jest przydatna, ale szczerze mówiąc, nie jestem pewien, czy powinieneś być w stanie określić wartości domyślne w interfejsie, ponieważ powinna to być decyzja implementacyjna.
Z drugiej strony to rozłączenie oznacza, że nie zawsze można używać zamiennie konkretnej klasy i interfejsu. To oczywiście nie stanowiłoby problemu, jeśli wartość domyślna jest podana w implementacji, ale jeśli ujawniasz swoją konkretną klasę jako interfejs (używając na przykład niektórych struktur IOC do wstrzyknięcia konkretnej klasy), to naprawdę nie ma punkt o wartości domyślnej, ponieważ dzwoniący zawsze musi ją podać.
MyInterface
i wywołać ją z opcjonalnego parametru: ((MyInterface)obj).TestMethod();
.