Есть ли разница между реализацией интерфейса и добавлением нового метода? - PullRequest
1 голос
/ 22 мая 2019

Как показано в приведенном ниже коде, существует два интерфейса IFoo, определенных в двух разных сборках:

/// assembly A
interface IFoo {
    void DoSomething()
}

/// assembly B
interface IFoo {
    void DoSomething()

    void DoSomethingElse()
}

/// assembly C
class Bar : IFoo {
    public virtual void DoSomething()

    public virtual void DoSomethingElse()
}

Предполагается, что сборка A и сборка B ошибочно имеют одинаковую подпись (либо слабое имя сборки, либо сильная).название).Будет ли сгенерированный MSIL для класса Bar отличаться в зависимости от того, использовалась ли сборка A или сборка во время сборки?

Другими словами, предположим, что мы строим проект со сборками A и C во время выполнения, верно?хорошо, чтобы заменить A со сборкой B во время выполнения?Или я получу исключения, такие как «IFoo.DoSomethingElse» не реализован, потому что во время процесса сборки DoSomethingElse считается новым методом в отличие от реализации существующего метода в интерфейсе.

1 Ответ

1 голос
/ 22 мая 2019

Отображения интерфейса создаются во время сборки, и если «сборка A» (1 метод), используемая во время сборки, чем класс Foo, отобразит только один метод в своей карте интерфейса.

Когда создается экземпляр класса, он будет пытаться использовать интерфейс, доступный во время выполнения (который не обязательно такой же, как тот, который используется во время компиляции, как в вашем случае), и не сможет отобразить новый второй метод.

На самом деле до C # 8 не существует хорошего способа ее решения - либо нужно понизить зависимость, чтобы его интерфейс был обратно совместим, либо перекомпилировать ваш код с новой версией зависимости.

Если ожидается, что это будет распространенной проблемой, вы можете рассмотреть возможность предоставления базового класса из «сборки A» реализациями методов по умолчанию, позволяющими добавлять методы для интерфейса и получать Foo из этого класса вместо интерфейса.

Как отметил Ханс Пассант, C # 8 вводит стандартные методы интерфейса для решения именно этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...