Я заметил, что с дополнительными параметрами в С# 4, если вы укажете параметр как необязательный на интерфейсе, НЕ НЕОБХОДИМО сделать этот параметр необязательным для любого класса реализации:
public interface MyInterface
{
void TestMethod(bool flag=false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
и поэтому:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Кто-нибудь знает, почему дополнительные параметры предназначены для работы таким образом?
С одной стороны, я полагаю, что возможность переопределять любые значения по умолчанию, указанные на интерфейсах, полезна, хотя, честно говоря, я не уверен, что вы даже можете указать значения по умолчанию на интерфейсе, поскольку это должно быть решение о внедрении.
С другой стороны, это отключение означает, что вы не всегда можете использовать конкретный класс и интерфейс взаимозаменяемо. Это, конечно, не будет проблемой, если значение по умолчанию указано в реализации, но тогда, если вы раскрываете свой конкретный класс в качестве интерфейса (используя некоторую среду IOC для инъекции конкретного класса, например), то действительно нет точка имеет значение по умолчанию, поскольку вызывающий должен всегда предоставлять его в любом случае.