Внедрение интерфейса - PullRequest
       22

Внедрение интерфейса

4 голосов
/ 11 сентября 2009

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

Я хотел бы дополнительно использовать одну из двух похожих сторонних библиотек, предоставляя классам, которые похожи в обеих библиотеках, одинаковые интерфейсы. Так что мне не нужно конвертировать там классы в мои.

Ответы [ 3 ]

3 голосов
/ 11 сентября 2009

Я не совсем понимаю, что вы имеете в виду под инъекцией интерфейса, но вы можете использовать шаблон Adapter для достижения этой цели. Смотрите также: http://dofactory.com/Patterns/PatternAdapter.aspx

Создайте свой собственный интерфейс, затем создайте свои собственные классы, которые реализуют интерфейс, который содержит / переносит сторонние классы.

1 голос
/ 11 сентября 2009

Пока вы имеете дело с интерфейсами, почему бы просто не обернуть классы в ваши собственные классы, которые реализуют интерфейсы?

0 голосов
/ 11 сентября 2009

Вы должны взглянуть на Pattern Decorator , который позволяет расширять класс композицией.

например. Данный запечатанный класс A, который реализует InterfaceA:

public interface InterfaceA
{
    int A {get; set;}
}

public sealed Class A : InterfaceA
{
    public int A {get;set;}
}

Вы можете расширить InterfaceA, а затем использовать класс декоратора B для инкапсуляции экземпляра класса A и предоставления дополнительных методов.

public interface MyExtendedInterfaceA : InterfaceA
{
    int B {get;set}
}

public class B : MyExtendedInterfaceA
{
    private InterfaceA _implementsA = new A();

    public int A
    {
        get
        {
            return _implementsA.A;
        }
        set
        {
            _implementsA.A = value;
        }
    }

    public int B {get; set;}
}

В качестве альтернативы, декоратор класса C может добавить совершенно новый интерфейс:

public interface InterfaceC
{
   int MethodC();
}

public class C : InterfaceA, InterfaceC
{
private InterfaceA _implementsA = new A();

    public int A
    {
        get
        {
            return _implementsA.A;
        }
        set
        {
            _implementsA.A = value;
        }
    }

    public int MethodC()
    {
        return A * 10;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...