基类还是普通类?

时间:2014-03-19 12:54:31

标签: c# asp.net .net asp.net-4.0

对于我们的asp.net Web应用程序v 4.0,我们正在定义一个包含应用程序中常见方法的类。为了实现这一目标,我们团队中有两个建议。一个用于创建基类,定义其中的方法并从该基类派生所有其他类。另一个是创建一个单独的类(不是基类)并且当需要访问公共方法时,在其他类中实例化该公共类。请指导我确定最佳方法..

2 个答案:

答案 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()