В моем проекте я нашел странную ситуацию, которая кажется полностью действительной в С#, потому что у меня нет ошибок времени компиляции.
Упрощенный пример выглядит следующим образом:
using System;
using System.Collections.Generic;
namespace Test
{
interface IFoo
{
void FooMethod();
}
class A
{
public void FooMethod()
{
Console.WriteLine("implementation");
}
}
class B : A, IFoo
{
}
class Program
{
static void Main(string[] args)
{
IFoo foo = new B();
foo.FooMethod();
}
}
}
Такой код компилируется. Однако обратите внимание, что A
не IFoo
, а B
не реализует методы IFoo
. В моем случае, случайно (после рефакторинга), A
имеет метод с той же сигнатурой. Но почему A
знает, как реализовать FooMethod
интерфейса IFoo
? A
даже не знает, что IFoo
существует.
Для меня такая конструкция опасна. Поскольку каждый раз, когда я реализую некоторый интерфейс, я должен проверить, не мешает ли каждый метод в этом интерфейсе методам базового класса.
Если это "чистая функция С#"? Как это называется? Я что-то пропустил?