我正在尝试使用依赖注入覆盖服务中的一小部分代码。遗憾的是,我想覆盖的现有类未使用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
而无需使用我的小额添加完全重新实现它?
答案 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)