C#-一个接口,两个实现:如何将方法调用从一个实现重定向到另一个?

时间:2018-12-19 20:42:04

标签: c# interface

我的接口有两个具有相同名称的实现,如下所示:

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()方法。 从实施2 调用RetrieveUserList()时,我希望将调用重定向到实施1 中的相同方法。

2 个答案:

答案 0 :(得分:5)

您可以使用继承,例如:

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();
    }
}

答案 1 :(得分:2)

除了Jens所说的之外,您还可以使用装饰器模式。

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();
    }
}