[英]How to get rid of an explicit cast in a Chain of Responsibility?
我目前有一个责任链的实现,它返回实现IResponse的对象。
public interface IRequest
{
}
public interface IResponse
{
}
public interface IFactory
{
bool CanHandle(IRequest request);
IResponse HandleRequest(IRequest request);
}
public class Foo : IResponse
{
public void SpecificMethod()
{
Console.WriteLine("SpecificMethod() only belongs to Foo");
}
}
public class FooRequest : IRequest
{
}
public class FooFactory : IFactory
{
public bool CanHandle(IRequest request)
{
return request is FooRequest;
}
public IResponse HandleRequest(IRequest request)
{
return new Foo();
}
}
public class FactoryManager
{
private readonly List<IFactory> _factoryImplementations = new List<IFactory>();
public void Register(IFactory factory)
{
_factoryImplementations.Add(factory);
}
public IResponse HandleRequest(IRequest request)
{
foreach (var factory in _factoryImplementations)
{
if (factory.CanHandle(request))
{
return factory.HandleRequest(request);
}
}
return null;
}
}
class Program
{
static void Main()
{
var manager = new FactoryManager();
manager.Register(new FooFactory());
var foo = (Foo) manager.HandleRequest(new FooRequest()); // How can I remove this cast?
foo.SpecificMethod();
Console.ReadLine();
}
}
此实现的目的是使我可以在需要时轻松替换实现。 问题是,如果我想对该对象执行任何特定的操作,例如访问foo.SpecificMethod()
,则必须显式foo.SpecificMethod()
请求的类型。
有什么办法可以使这个(Foo)
演员消失吗?
编辑:可以使用动态变量来解决此问题,但是采用静态类型的解决方案是可取的。
如果您希望能够调用不在主接口上的唯一函数,则必须将其强制转换(或使用该方法请求更特定的接口)。
使用接口意味着“此方法将具有这些可用的公共方法”。 您可以从多个接口( public interface IMoreSpeific : IGeneric
)继承,但是如果不进行强制转换,则无法调用具有其他方法的特定类实现。
您可以在界面上制作一些通用的东西,例如DoWork()
方法,但是该界面的目的是要具有可重用和通用的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.