可以通过接口影响多态性

时间:2017-06-15 18:05:22

标签: c# polymorphism

我正在尝试使用依赖注入覆盖服务中的一小部分代码。遗憾的是,我想覆盖的现有类未使用virtual关键字实现,因此我无法直接覆盖该方法。库中的类和接口看起来像这样:

//NOTE: I CANNOT ALTER ANY OF THIS CODE IT'S IN THE LIBRARY
public interface IService
{
    string DoWork(); //Actual name doesn't matter
}

public class DefaultService : IService
{
    public string DoWork() { return "Default Service result"; }
}

在我的代码中,我想覆盖默认服务,以便我可以扩展它的DoWork结果,所以我尝试了这个:

public class MyService : DefaultService
{
    public new string DoWork() { return base.DoWork() + " some more words"; }
}

现在通过一些实验,很明显,这实际上并没有达到预期的效果。

public static void Main()
{
    IService serv = new MyService();
    Console.WriteLine(serv.DoWork()); // Prints: "Default Service result"
}

那么我可以遵循的模式是否允许我使用整个DefaultService而无需使用我的小额添加完全重新实现它?

2 个答案:

答案 0 :(得分:3)

您需要将继承添加到接口,因为类将显式实现它,当您将实例强制转换为接口时,它将使用新函数:

public interface IService
{
    string DoWork(); //Actual name doesn't matter
}

public class DefaultService : IService
{
    public string DoWork() { return "Default Service result"; }
}

public class MyService : DefaultService, IService
{
    public new string DoWork() { return base.DoWork() + " some more words"; }
}

答案 1 :(得分:3)

对不起,这有点粗糙。 你可以看看装饰模式

Decorator : IService
{
     IService _service
     Public Decorator(IService service)
     {
           _service = service
     }

     public string DoWork()
     {
          //new code
          _service.DoWork()
         //new code
     }
}

然后

IService service = new Decoration(new MyService)
相关问题