«Внедрить» реализацию в класс, используя методы расширения и тем самым реализовать интерфейс? - PullRequest
0 голосов
/ 30 января 2011

Можно ли «внедрить» код в класс (путем ссылки на пространство имен, содержащее методы расширения) и тем самым имитировать реализацию базового класса для некоторого интерфейса? Или это считается плохой практикой (даже если это невозможно)?

Imports MyApp.Extensions

Class SomeClass : Inherits System.SomeBaseClass : Implements MyApp.IAppInterface

End Class

Public Interface IAppInterface
    Sub InterfaceMethod()
End Interface


Namespace MyApp.Extensions
    Public Module SomeClassExtensions
        Public Sub InterfaceMethod(ByVal someClass as MyApp.SomeClass)
            //Implementation
        End Sub
    End Module
End Namespace

Ответы [ 2 ]

1 голос
/ 30 января 2011

Вопрос в том, как ваша SomeClassExtensions.InterfaceMethod осуществит реализацию? Т.е. какие свойства / методы были бы определены в IAppInterface, чтобы было достаточно данных / поведения для их реализации в методе расширения? Я думаю, вы обнаружите, что интерфейс должен иметь определенный «базовый» набор методов, чтобы он был значимым.

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

0 голосов
/ 30 января 2011

Я думаю, вы неправильно понимаете, что такое методы расширения. Здесь - это вопрос о шаблонах проектирования, связанных с методами расширения. Онтология метода расширения состоит в том, что они «привязывают» действия к объекту, а не к обычным отношениям «является». Вы не можете реализовать методы интерфейса с ними, потому что любой объект, к которому присоединяется метод расширения, не является абстрактным (вы уже создали его экземпляр, верно?), Поэтому это может привести к ошибке компиляции.

...