【发布时间】:2014-01-28 09:32:16
【问题描述】:
简介
假设我有一个类组装流水线。组装流水线包含多个步骤。每个步骤都可以执行:
public interface IStep
{
IContext Execute(IContext context);
}
每个步骤都有一个特定的 IContext,其中包含一些关于要处理什么的信息。
组装流水线包含多个步骤。它们可以通过在组装流水线上调用 Execute 来执行:
public class Assemblyline
{
private readonly List<IStep> _steps;
public Assemblyline(List<IStep> steps)
{
_steps = steps;
}
public void Execute(IContext context)
{
foreach (var step in _steps)
{
step.Execute(context);
}
}
}
我有一个通用的 IContaxt 接口:
public interface IContext
{
string Id { get; set; }
}
以及具体的上下文:
public interface IAbcContext : IContext
{
string Abc { get; set; }
}
public interface IDefContext : IContext
{
string Def { get; set; }
}
public class XyzContext : IAbcContext, IDefContext
{
public string Id { get; set; }
public string Abc { get; set; }
public string Def { get; set; }
}
上下文可以通过特定的步骤来处理:
public class AbcStep : IStep
{
public IContext Execute(IContext context)
{
var abcContext = (IAbcContext) context;
abcContext.Abc = "some value for Abc";
return abcContext;
}
public string Id { get; set; }
}
public class DefStep : IStep
{
public IContext Execute(IContext context)
{
var defContext = (IDefContext)context;
defContext.Def = "some value for Def";
return defContext;
}
public string Id
{
get; set; }
}
这就是我可以执行代码的方式:
internal class Program
{
private static void Main()
{
var steps = new List<IStep>();
steps.Add(new AbcStep());
steps.Add(new DefStep());
var assemblyline = new Assemblyline(steps);
var context = new XyzContext {Id = "1", Abc = "blabla", Def = "other value"};
assemblyline.Execute(context);
}
}
问题
在每个特定步骤中,我必须将 IContext 转换为我真正想要的类。看到这一行:
var abcContext = (IAbcContext) 上下文;
public class AbcStep : IStep
{
public IContext Execute(IContext context)
{
var abcContext = (IAbcContext) context;
abcContext.Abc = "some value for Abc";
return abcContext;
}
public string Id { get; set; }
}
我希望我可以离开演员阵容,然后这样做:
public class AbcStep : IStep
{
public IContext Execute(IAbcContext context)
{
context.Abc = "some value for Abc";
return context;
}
public string Id { get; set; }
}
但后来我收到了这条消息:
接口成员'Execute(IContext)'未实现。
无论如何我可以删除演员表吗?也许使用泛型或其他东西?
【问题讨论】:
-
你的问题不在于演员本身(在很多情况下都会失败)。这整个事情似乎没有明确的概念。
-
某事,某处,将不得不做这个演员或另一个。例如。如果您在其上下文中创建了
IStep泛型,那么您将 a) 必须为IStep引入一个新的非泛型基础来实现,以便您仍然可以将所有它们(尽管它们具有不同的泛型类型)存储在一个单个List<T>和 b) 必须先将它们转换为适当的类型,然后才能调用Execute方法。 -
看了几次后我不太明白,但一个明显的一点是你必须投射的原因是因为你尝试使用的方法不是你的一部分IContext 接口。而且您似乎在不同的实现中有不同的方法。为什么你不能标准化你的界面?
-
添加接口方法的特定实现将解决命名冲突。你没有。
-
您可以为 IContext 实现
SetValue- 也许这会有所帮助。然后上下文本身必须知道如何处理它。
标签: c# generics interface casting