【问题标题】:Best way to share a function between two class files在两个类文件之间共享函数的最佳方式
【发布时间】:2013-08-24 22:22:47
【问题描述】:

有两个文件A.csB.cs。有一个方法fn() 在两个类中都使用。

方法fn() 用于两个类文件。如果我在许多类文件(比如 100 个文件)中需要这种方法,这会增加代码复杂性。

我知道我们可以通过为定义此方法的类创建一个对象来调用此方法。如何在两个或多个类之间共享此函数,而无需每次都创建一个对象来访问此方法?

【问题讨论】:

  • 如果有 100 个类调用您的方法,为什么会增加复杂性?例如,如果我在 100 个类中使用 String.Contains 方法,则该方法本身仍然简单易读。
  • 使其成为静态方法?
  • 1.使用此方法创建一个静态类作为静态方法 2. 制作基类,从该基类继承所有类。在基类中实现这个方法
  • 创建一个包含所有常用方法的类。那么A.cs到Z.cs就可以一直使用Common.cs中的常用方法
  • @TimSchmelter 如果有 100 个类调用此方法,那么我将不得不在不同的类文件中为同一个类创建 100 个对象。

标签: c# class methods


【解决方案1】:

将方法放在静态类中:

public static class Utils
{
     public static string fn()
     {
         //code...
     }
}

然后您可以在 A.csB.cs 中调用它,而无需每次都创建一个新的类实例:

A foo = new A();
foo.Property = Utils.fn();

或者,您可以创建一个所有类都继承自的BaseClass

public class BaseClass
{
    public BaseClass() { }
    public virtual string fn()
    {
        return "hello world";
    }
}

public class A : BaseClass
{
    public A() { }
}

然后你会像这样调用fn()

A foo = new A();
string x = foo.fn();

【讨论】:

    【解决方案2】:

    假设此方法是自包含的,您可以创建一个static class 并将此方法作为静态方法放入其中,然后由其他类调用。

    如果 is 不是自包含的,您可以尝试在某个超类中声明它,并让其他 100 个类扩展该类。

    【讨论】:

      【解决方案3】:

      我希望这个函数不是真的被称为fn(),而是实际上以它的作用命名,比如CalculateTotal()。然后你可以把这个方法提取到一个类中,比如:TotalCalculator

      现在在应用程序启动时,最好使用依赖注入,您创建一个类的实例,该实例在需要它的对象之间共享。像这样:

      class TotalCalculator
      {
          public int Calculate()
          {
              return 42;
          }
      }
      
      class NeedsCalculator1
      {
          TotalCalculator _calculator; 
      
          public NeedsCalculator1(TotalCalculator calculator)
          {
              _calculator = calculator; 
          }
      
          public void Foo()
          {
              _calculator.Calculate();
          }
      }
      
      class NeedsCalculatorToo
      {
          TotalCalculator _calculator; 
      
          public NeedsCalculatorToo(TotalCalculator calculator)
          {
              _calculator = calculator; 
          }
      
          public void Bar()
          {
              _calculator.Calculate();
          }
      }
      

      然后你实例化计算器一次,并将它传递给其他类的构造函数:

      TotalCalculator calculator = new TotalCalculator();
      
      NeedsCalculator1 dependency1 = new NeedsCalculator1(calculator);
      NeedsCalculatorToo dependency2 = new NeedsCalculatorToo(calculator);
      

      您现在可以通过创建包含构造函数和受保护的TotalCalculator 实例字段的基类来进一步抽象计算器依赖项。

      【讨论】:

      • 这里真的需要依赖注入吗?
      • 这里真的需要static吗?我们不知道 fn() 做了什么,也不知道它或对它的调用是否需要被嘲笑。
      • 好吧,IMO 似乎有点矫枉过正,因为这很可能是一个简单的问题。总是最好从小处着手。只是我的 2 美分..
      • 看看When to Use Static Classes in C#。构造函数注入添加了一些样板代码,但允许轻松扩展和测试类。 OP 说他将在数百个其他类中需要这个类/方法(说实话,这本身听起来像是一个问题),所以我不会说这是一个简单的问题。
      猜你喜欢
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多