抽象类C#中的不良做法

时间:2017-06-28 14:58:50

标签: c# abstract

我正在尝试通过在必要时实现接口和抽象类来提高我的编码标准,但是我想问一下有关抽象类的实践。

我正在创建一个Web应用程序和我需要进行一些数据处理的网站的一个方面,我创建了一个抽象类,它看起来像这样。

public abstract class TestAbstractClass
{
  public abstract void doDataProcessing();
}

我需要在整个应用程序中多次实现这个'do​​DataProcessing'方法,这取决于用户在我的网站上的位置,它将进行非常类似的数据处理,只需要一两个不同的东西。

例如:

用户在特定页面上:

public Page1Class: TestAbstractClass
{
  public override void doDataProcessing()
  {
    //do data processing
  }
}

用户在另一页上

public Page2Class: TestAbstractClass
{
  public override void doDataProcessing()
  {
    //do data processing but with slight change
  }
}

用户在另一页上

public Page3Class: TestAbstractClass
{
  public override void doDataProcessing()
  {
    //do data processing but with another change
  }
}

这是最佳做法吗?或者只是创建一个类,并且只是对传递给'doDataProcessing()'方法的内容做各种条件语句?

我觉得如果我使用我发布的方法来实现它,我会在这3个类中有很多重复的代码,那可以吗?

我希望这是有道理的。

2 个答案:

答案 0 :(得分:6)

这感觉您需要更多地分解解决方案。 doDataProcessing听起来像是可以分成小块的东西。有一些高级设计模式可以帮助您构建它。

如果doDataProcessing类似,但变化很小,请查看Strategy patternDecorator pattern

答案 1 :(得分:0)

如果您不打算在基本doDataProcessing中有任何实现,那么只需使用@phuzi推荐的接口。如果在大多数情况下你有一些完全相同的逻辑,那么最好使用抽象类,在奇怪的场景中,你可以覆盖和/或扩展继承类中的基本逻辑。

修改

根据你给我的信息,我可能会做以下事情:

public abstract class TestAbstractClass
{
  public void Process()
  {
     MethodThatGetsCalledEveryTime();
     doDataProcessing();
  }

  public virtual void doDataProcessing()
  {// can add frequent logic here}

  protected void MethodThatGetsCalledEveryTime()
  {
      // do stuff here
  }
}
通过这种方式,您可以确保" MethodThatGetsCalledEveryTime"将始终被调用,并且如果您向doDataProcessing添加其他逻辑,该逻辑也将从适当的位置运行。