【问题标题】:Abstract class which concrete class to use? Design issue?抽象类使用哪个具体类?设计问题?
【发布时间】:2012-01-05 13:47:27
【问题描述】:

我有一个设计问题。我正在修改现有代码以及实例化新类的位置。由于将类变成了我可以理解的抽象类,这给了我错误。它引发错误,因为您无法创建抽象类的实例。

我在下面有这段代码

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

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

我想要代码示例..

【问题讨论】:

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


    【解决方案1】:

    创建工厂:

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

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

    【讨论】:

    • 就是我写的,哈哈。 MSDN 参考 - msdn.microsoft.com/en-us/library/ee817667.aspx
    • @RichardD:那篇文章指的是该模式的更高级变体,而我的代码只是 factory method,示例是 abstract factory
    • 我在哪里填充“IsFullMoon”
    • IsFullMoon 是一个玩笑,用来说明你应该把逻辑放在哪里来决定使用什么类。在现实生活中,它可能是检查配置文件值、http 请求属性或其他内容。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多