基类还是通用类?

3

针对我们的asp.net web应用程序v4.0,我们正在定义一个包含整个应用程序通用方法的类。为了实现这一目标,我们团队内有两个建议:一个是创建一个基类,在其中定义方法,并从该基类派生所有其他类;另一个是创建一个单独的类(不是基类),并在其他类中实例化这个通用类以访问通用方法。请指导我确定最佳方法。


6
你的问题比较模糊。两种方法都有适用的时间和场合。你能否举出一些具体的例子,说明这个常见功能是做什么用的? - JLRishe
我们在谈论什么样的方法?创建一个通用的基类通常是代码异味 - 如果您提供一个具体的类和建议的基类的示例,您将得到更好的答案。 - D Stanley
不知道你想要实现什么,很难回答这个问题。如果单一职责原则被违反了,就应该避免使用基类方法。 - Carsten
创建一个抽象类,将这些方法放在其中,并从中继承其他类。 - Jalpesh Vadgama
这取决于类之间的关系。如果是is-a关系,则采用第一种方法。如果是has-a关系,则使用第二种方法。 - Binson Eldhose
可能是优先使用组合而非继承?的重复问题。 - nawfal
2个回答

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

通过注入帮助类,您可以解耦类,以便可以用共享相同接口的不同实现替换帮助类。 使用帮助程序的类 可与任何派生自 HelperClass (或 HelperClass 本身)的类一起使用。因此,如果需要装饰帮助方法或在某些情况下需要特殊实现,则可以轻松实现。
使用组合还使您可以单独测试帮助方法。
但是,如果涉及非常基本的帮助方法,则也可以考虑具有静态帮助方法的静态类。请注意,您在类之间引入了强依赖性,并且无法轻松地调整实现。
public static class HelperClass
{
    public static void HelperMethod()
    { 
        // ...
    }
}

public class ClassThatUsesHelper
{
    public void DoSomething()
    {
        HelperClass.HelperMethod();
    }
}

0

你的问题比较模糊,但如果你需要一个所有程序中的对象都需要访问其成员变量的方法,那么我建议创建一个抽象类,并以此为基础创建你的对象。

如果你需要在代码的任何位置执行某种计算,只需在一个专门用于此目的的类中创建一个公开的静态方法,例如 MyMathClass.InterestingFourierTransform()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接