我正在尝试通过在必要时实现接口和抽象类来提高我的编码标准,但是我想问一下有关抽象类的实践。
我正在创建一个Web应用程序和我需要进行一些数据处理的网站的一个方面,我创建了一个抽象类,它看起来像这样。
public abstract class TestAbstractClass
{
public abstract void doDataProcessing();
}
我需要在整个应用程序中多次实现这个'doDataProcessing'方法,这取决于用户在我的网站上的位置,它将进行非常类似的数据处理,只需要一两个不同的东西。
例如:
用户在特定页面上:
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个类中有很多重复的代码,那可以吗?
我希望这是有道理的。
答案 0 :(得分:6)
这感觉您需要更多地分解解决方案。 doDataProcessing
听起来像是可以分成小块的东西。有一些高级设计模式可以帮助您构建它。
如果doDataProcessing
类似,但变化很小,请查看Strategy pattern或Decorator 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添加其他逻辑,该逻辑也将从适当的位置运行。