Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不使用IF条件的情况下执行此操作_C#_Oop_Object Oriented Analysis - Fatal编程技术网

C# 如何在不使用IF条件的情况下执行此操作

C# 如何在不使用IF条件的情况下执行此操作,c#,oop,object-oriented-analysis,C#,Oop,Object Oriented Analysis,我有一个定义一个方法的接口。此接口有多个类,它们以不同的方式实现该接口 例如: 我的工厂类将有一堆这样的IF语句 if (some condition) { IJob job = new SomeJob (); else { IJob job = new AnotherJob (); } 是否有一种方法可以避免每次出现新情况时修改factory类。这不能仅仅通过添加一个实现IJob的新类来实现吗 编辑: [我正试图弄清楚这些人在做什么] 感谢您的时间…您必须以某种方式将条件和决

我有一个定义一个方法的接口。此接口有多个类,它们以不同的方式实现该接口

例如:

我的工厂类将有一堆这样的IF语句

if (some condition)
{
   IJob job = new SomeJob (); 
else
{
   IJob job = new AnotherJob (); 
}
是否有一种方法可以避免每次出现新情况时修改factory类。这不能仅仅通过添加一个实现IJob的新类来实现吗

编辑: [我正试图弄清楚这些人在做什么]


感谢您的时间…

您必须以某种方式将条件和决策联系起来

Dictionary<int, Action<IJob>> _methods = new ...
然后使用它:

public IJob FactoryMethod(int condition)
{
   if(_methods.ContainsKey(condition))
   {
      return _methods[int]();
   }
   return DefaultJob; //or null
}
您需要在应用程序启动时填写字典。从配置文件,或与其他一些代码。 所以当你有新的情况时,你不需要改变工厂。
您喜欢这种变体吗?

我不喜欢您,但您可以始终使用泛型:

public IJob GetJob<T>() where : IJob ,new()
{
    IJob job = new T(); 
    return job;

}
public IJob GetJob()其中:IJob,new()
{
IJob作业=新的T();
返回工作;
}

在某些地方,必须做出创建内容的决定,而且可能总是涉及某种类型的条件语句

但是,如果可以按照合理的命名约定进行安排和/或添加反射支持(如属性),则可以通过使用反射来减少修改factory类的需要

有关如何在.Net中执行此操作的一些想法,请参阅


您还可以根据字符串到类名的映射,甚至是在应用程序启动时加载的方法的另一个好答案中,做出决定,并在运行时通过反射创建类。有些东西必须提供地图,但您可以将大部分决策转移到配置上。

这取决于您所在领域的动态。如果您需要经常评估条件,您可以为
IJob
的每个实现使用某种工厂,例如
SomeJobFactory
另一个jobfactory

每个方法都有方法
meetcondition
,如果满足条件,该方法将计算为true,然后返回新实例

public class SomeJobFactory : Factory<IJob>
{
   public bool MeetsCondition() { ... }

   public IJob CreateInstance() { return new SomeJob(); }
}
您还可以使用IoC获取所有工作工厂:

allJobFactories = IoC.ResolveAll<Factory<IJob>>();
allJobFactories=IoC.ResolveAll();
在本例中,添加新作业工厂时,不必修改一行代码


如果您的代码比较静态,您可以使用DI和IoC,在启动时在其中创建对象。

如果您不想
If
条件编译器如何理解您要执行的开关代码块。?程序运行时条件会改变吗?对象应该分配到某个地方。@Antonizikov:是的,条件将取决于用户输入。@KarelFrajtak:但是需要有一些条件,根据这些条件,我将正确的对象发送给期望它的类。对吗?。。您有任何代码示例吗?这没有帮助,因为调用者需要知道实现类型(它的调用方式是这样的
var job=Factory.GetJob()
),那么工厂给您带来了什么好处呢?我建议使用与int不同的类型(可能是enum?),以使意图更加可读和明显(1在这里表示什么?
var job=JobFactory.GetJob(1)
var job=JobFactory.GetJob(Requirement.CleanUp)
更好地传达了意图,int是一个例子。字典的方法名也是一个例子。FactoryMethod是一个坏名字:)总之,好的建议。谢谢你的链接。我去看看。加载所有类不会影响实时应用程序的性能吗?您可能会“及时”加载类。也就是说,当调用工厂方法时,工厂仍然使用反射来完成。
public class SomeJobFactory : Factory<IJob>
{
   public bool MeetsCondition() { ... }

   public IJob CreateInstance() { return new SomeJob(); }
}
foreach(var jobFactory in allJobFactories)
{
   if(jobFactory.MeetsCondition())
   {
      return jobFactory.CreateInstance();
   }
}
allJobFactories = IoC.ResolveAll<Factory<IJob>>();