具体类使用的抽象类?设计问题?

时间:2011-11-24 11:23:31

标签: c# oop design-patterns architecture abstract-class

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

我有以下代码

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();

BExampleProcessor pro = new BExampleProcessor();

因为我希望我的应用程序决定使用哪个类。我怎样才能使它加载正确的类?

我想要代码示例..

2 个答案:

答案 0 :(得分:7)

创建工厂:

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

然后通过调用new ExampleProcessor()替换对ExampleProcessorFactory.Create()的所有来电。现在,您已经封装了实例化逻辑,并选择了要实例化的具体类到一个可以应用任何逻辑来决定要实例化的类的地方。 (决定何时使用哪一类可能会从一些改进中获益而与满月无关的逻辑。)

答案 1 :(得分:2)

由于您希望应用程序决定使用哪个具体子类,我建议您使用Factory模式 这样,客户端代码只知道您正在使用ExampleProcessor,并且实现细节仍然隐藏。