C # - один интерфейс, две реализации: как перенаправить вызов метода из одной реализации в другую? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть две реализации с тем же именем для моего интерфейса, как показано ниже:

interface IDBCaller
{ 
    IEnumerable<User> RetrieveUserList();
    void Method1();
    void Method2();
}

//First implementation of IDBCaller in project1  
class DBCaller : IDBCaller
{

    public IEnumerable<User> RetrieveUserList()
    {
        return new List<User>();
    }

    public void Method1()
    {
        //doing something
    }

    public void Method2()
    {
        //doing something
    }
}
//Second implementation of IDBCaller in project2 
class DBCaller: IDBCaller
{

    public IEnumerable<User> RetrieveUserList()
    {
        return null; //Currently returns null but the desire state is to call the RetrieveUserList in Implementation1 from project 1
    }
    public void Method1()
    {
         //doing something
    }

    public void Method2()
    {
         //doing something
    }
}

Реализация 1 и 2 имеют один и тот же метод RetrieveUserList().Когда RetrieveUserList() вызывается из Реализация 2 , я хочу, чтобы вызов был перенаправлен на тот же метод в Реализация 1 .

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

В дополнение к тому, что сказал Дженс, вы можете использовать шаблон декоратора.

public interface IDBCaller
{ 
    IEnumerable<User> RetrieveUserList();
}

public class Implementation1 : IDBCaller
{
    public IEnumerable<User> RetrieveUserList()
    {
        return new List<User>();
    }
}

public class Implementation2 : IDBCaller
{
    IDBCaller decoratedImplementation;

    public Implementation2(IDBCaller decoratedImplementation)
    {
        this.decoratedImplementation = decoratedImplementation;
    }


    public IEnumerable<User> RetrieveUserList()
    {
        return this.decoratedImplementation.RetrieveUserList();
    }
}
0 голосов
/ 19 декабря 2018

Вы можете использовать наследование, например:

interface IDBCaller
{ 
    IEnumerable<User> RetrieveUserList();
}

class Implementation1 : IDBCaller
{
    public virtual IEnumerable<User> RetrieveUserList()
    {
        return new List<User>();
    }
}

class Implementation2 : Implementation1
{
    public override IEnumerable<User> RetrieveUserList()
    {
        return base.RetrieveUserList();
    }
}

или использовать базовый класс с реализацией RetrieveUserList

interface IDBCaller
{ 
    IEnumerable<User> RetrieveUserList();
    void Method1();
    void Method2();
}

class ImplementationBase
{
    public virtual IEnumerable<User> RetrieveUserList()
    {
        return new List<User>();
    }

}
class Implementation1 : ImplementationBase, IDBCaller
{
    public void Method1()
    {
        throw new NotImplementedException();
    }

    public void Method2()
    {
        throw new NotImplementedException();
    }
}

class Implementation2 : ImplementationBase, IDBCaller
{
    public void Method1()
    {
        throw new NotImplementedException();
    }

    public void Method2()
    {
        throw new NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...