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# 抽象类使用哪个具体类?设计问题?_C#_Oop_Design Patterns_Architecture_Abstract Class - Fatal编程技术网

C# 抽象类使用哪个具体类?设计问题?

C# 抽象类使用哪个具体类?设计问题?,c#,oop,design-patterns,architecture,abstract-class,C#,Oop,Design Patterns,Architecture,Abstract Class,我有一个设计问题。我正在修改现有代码和实例化新类的地方。由于将类转换为我能理解的抽象类,它给了我错误。它抛出了一个错误,因为您无法创建抽象类的实例 我有下面的代码 ExampleProcessor pro = new ExampleProcessor(); 但是ExmapleProcessor类现在变成了抽象类 public abstract class ExmapleProcessor { public abstract void Method1(); public abstract

我有一个设计问题。我正在修改现有代码和实例化新类的地方。由于将类转换为我能理解的抽象类,它给了我错误。它抛出了一个错误,因为您无法创建抽象类的实例

我有下面的代码

ExampleProcessor pro = new ExampleProcessor();
但是ExmapleProcessor类现在变成了抽象类

public abstract class ExmapleProcessor {
  public abstract void Method1();
  public abstract void Method2();
}
子类AExampleProcessor和BExampleProcessor

public class AExampleProcessor : ExampleProcessor 
{  
  public override void Method1()  { //do something }
  public override void Method2()  { //do something }
}

public class BExampleProcessor : ExampleProcessor 
{
  public override void Method1()  { //do something }
  public override void Method2()  { //do something }
}
因此,这一行在我的应用程序中到处都会导致42个错误“ExampleProcessor pro=new ExampleProcessor();”

我不想这样做

AExampleProcessor pro = new AExampleProcessor();

因为我想让我的应用程序决定使用哪个类。如何使它加载正确的类


我想要一些代码示例。

由于您希望应用程序决定使用哪个具体的子类,我建议您使用工厂模式。
这样,客户机代码只知道您正在使用ExampleProcessor,而实现细节将保持隐藏状态。

创建工厂:

public static class ExampleProcessorFactory
{
   public static ExampleProcessor Create()
   {
       if(IsFullmoon)
           return new ExampleProcessorA();
       else
           return new ExampleProcessorB();
   }
}

然后将对
newexampleprocessor()
的所有调用替换为对
ExampleProcessorFactory.Create()
的调用。现在,您已经将实例化逻辑和选择要实例化的具体类封装到一个位置,在这里您可以应用任何逻辑来决定要实例化的类。(决定何时使用哪个类可能会从某些改进中受益的逻辑与满月无关。)

就我刚才写的,lol.MSDN Reference-@RichardD:那篇文章提到了该模式的一个更高级的变体,而我的代码只是一个例子。我在哪里填充了“IsFullMoon”
IsFullMoon
的意思是一个笑话,用来说明在决定使用哪个类时应该将逻辑放在哪里。在现实生活中,它可能是对配置文件值、http请求属性或其他内容的检查。
public static class ExampleProcessorFactory
{
   public static ExampleProcessor Create()
   {
       if(IsFullmoon)
           return new ExampleProcessorA();
       else
           return new ExampleProcessorB();
   }
}