对于我们的asp.net Web应用程序v 4.0,我们正在定义一个包含应用程序中常见方法的类。为了实现这一目标,我们团队中有两个建议。一个用于创建基类,定义其中的方法并从该基类派生所有其他类。另一个是创建一个单独的类(不是基类)并且当需要访问公共方法时,在其他类中实例化该公共类。请指导我确定最佳方法..
答案 0 :(得分:5)
如果基类和派生类之间存在真正的 is-a 关系,我只会去基类路由。一个原因是类只能从单个基类继承。我会以明智的方式使用这种关系。仅仅共享一些辅助方法并不是一种值得阻止这种关系的方案。
如果你想在几个类中使用一些辅助方法,那么组合是你在第二种方法中描述的更好的方法。您不应该在类中创建对象,而应考虑是否可以将实例注入到类中(有关依赖项注入的详细信息,请参阅此link),例如:
public class HelperClass
{
public virtual void HelperMethod()
{
// ...
}
}
public class ClassThatUsesHelper
{
private readonly HelperClass _helper;
public ClassThatUsesHelper(HelperClass helper)
{
_helper = helper;
}
public void DoSomething()
{
_helper.HelperMethod();
}
}
通过注入帮助程序类,可以将类解耦,以便可以通过共享同一接口的其他实现替换辅助类。 ClassThatUsesHelper
适用于派生自HelperClass
(或HelperClass
本身)的任何类。因此,如果您需要修饰辅助方法或在某些情况下需要特殊实现,这可以毫无问题地进行。
使用合成还可以单独测试辅助方法。
但是,如果它是关于非常基本的辅助方法,您可能还会考虑使用静态辅助方法的静态类。请注意,您在类之间引入了强烈的依赖关系,并且无法轻松调整实现。
public static class HelperClass
{
public static void HelperMethod()
{
// ...
}
}
public class ClassThatUsesHelper
{
public void DoSomething()
{
HelperClass.HelperMethod();
}
}
答案 1 :(得分:0)
你的问题很模糊,但如果你需要一个方法,你的程序中的所有对象都需要访问,使用它们的成员变量,那么我建议创建一个抽象类,你的对象是基于。
如果您需要在代码中的任何位置执行某种计算,只需在专门用于此目的的类中创建公共静态方法。例如MyMathClass.InterestingFourierTransform()
。