我有一个情况,我有一些类,每个类都处理一个令牌。他们都从一个基本处理程序类下降(简化了一点,所以请原谅任何反编译错别字):如何声明类型列表,并稍后实例化?
public abstract class TokenClassBase
{
public static bool HandlesTokenType(TokenKind AType)
{
return handledTokens.Contains(AType);
}
protected virtual void HandleToken(AToken)
{
}
}
public class TokenClass1 : TokenClassBase
{
public static new bool HandlesTokenType(TokenKind AKind)
{
return AKind == TokenKind.type1;
}
public override void HandleToken(AToken)
{
//do some work
}
}
// public class TokenClass2... etc
我也有一个工人阶级,我想存储这些处理程序的列表,并后来实例化处理的一个处理令牌:
public class MyWorker
{
private List<Type> handlers;
public MyWorker()
{
handlers = new List<Type>;
handlers.Add(typeof(TokenClass1));
handlers.Add(typeof(TokenClass2));
//... etc
}
protected virtual void HandleToken(AToken)
{
foreach (TokenBaseClass handler in handlers)
{
if (handler.HandlesToken(AToken))
{
instantiate(handler);
handler.HandleToken(AToken);
break;
}
}
}
}
我的问题是,我该如何处理最后的foreach?这甚至是可能的 - 还是有更好的方法?我喜欢将来可以添加新类型的扩展性,只需将它们添加到处理程序列表(或者甚至从外部传递它们)即可。 我正在使用C#,框架3.5+。
你也可以让处理程序实现ICloneable(如果你想根据'serivce请求'克隆一个实例) – sehe 2011-04-24 19:31:42
@sehe:是的,但你仍然需要一个实例列表,而不是一个类型列表。 – 2011-04-24 19:34:50
啊哈,我误解了你的评论,并且认为这些类型已经被他们的实例存储了。读得太快了,斯里。仍然ICloneable环在这里主题:) – sehe 2011-04-24 19:37:53