【问题标题】:Base class or common class?基类还是普通类?
【发布时间】:2014-03-19 12:54:31
【问题描述】:

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

【问题讨论】:

  • 你的问题比较模糊。两种方法都有其时间和地点。你能举一些具体的例子来说明这个通用功能的作用吗?
  • 我们在谈论什么样的方法?创建一个通用基类通常是一种代码味道——如果你给出一个类的具体例子和提议的基类,你会得到更好的答案。
  • 如果不知道您到底想要达到什么目标,就很难回答这个问题。每当违反单一职责原则时,都应避免使用基类方法。
  • 创建一个抽象类,将这些方法放在那里并从中继承其他类。
  • 这取决于类之间的关系。如果是关系,则采用第一种方法。如果它有关系,请使用第二种方法。

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


【解决方案1】:

如果基类和派生类之间存在真正的 is-a 关系,我只会走基类路线。一个原因是一个类只能从一个基类继承。我会以明智的方式使用这种关系。仅仅分享一些辅助方法并不值得阻止这种关系。

如果您想在多个类中使用一些辅助方法,composition 是您在第二种方法中描述的更好方法。与其在类中创建对象,不如考虑是否可以将实例注入到类中(有关依赖注入的详细信息,请参阅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();
    }
}

【讨论】:

    【解决方案2】:

    您的问题含糊不清,但如果您需要一个方法,程序中的所有 对象 都需要访问该方法,该方法使用它们的成员变量,那么我建议创建一个抽象类,在该类上你的对象是基于的。

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

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2018-06-09
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2013-01-02
      • 1970-01-01
      相关资源
      最近更新 更多