2

如果我有一个带有我无法更改的公共方法(非静态)的类。
我需要添加一些我自己的方法,这些方法将使用现有的公共非静态方法,

我怎样才能以正确的方式做到这一点?

现在,在我自己的方法中,我正在创建自己的类的实例以使用其他方法,但我认为这不是一个好方法。

例子:

class aaa
{

  public string a(int i)
  {
    ...
  }
  public string b (int i)
  {
    ...
  }

  public static void x()
  {
    aaa myclass = new aaa();
    string str = myclass.a(5);
  }

}
4

8 回答 8

3

我认为你的设计并不完全正确,但如果你不能改变你的设计,这可能会奏效。虽然我也认为这种工作方式不是正确的方式。

public class MyClass
{
    public string MethodA(int i)
    {
        return StaticMethodA(i);
    }

    private static string StaticMethodA(int i)
    {
        return String.Format("i is {0}", i);
    }

    public static void MethodX()
    {
        string str = StaticMethodA(5);
    }
}

现在您可以执行以下操作:

MyClass mc = new MyClass();
string str = mc.MethodA(3);

//or

MyClass.MethodX();
于 2013-06-20T14:32:00.877 回答
2

你所描述的看起来很像C# 的扩展方法。在单独的static类中定义它们,并将它们当作实例方法使用。

于 2013-06-20T14:18:12.763 回答
1

听起来您真的希望您的实例方法是静态的;它从一开始就应该是静态的,因为它不依赖于使用对象的任何内部状态(因为您的新方法没有被给出、给出或重用该类型的任何实例)。您只是无法进行重大更改以使其成为静态,因为在非静态上下文中使用它的依赖项太多。

如果您无法将方法更改为静态的,即使它在逻辑上是静态的,那么您的解决方案确实是您在这种情况下可以做的最好的。它本质上是在非静态方法中创建一个静态“窗口”。

于 2013-06-20T14:21:47.780 回答
0

要调用非静态方法,你必须有类的实例,你想调用哪个实例方法。同样因此您不能更改 class aaa,那么您只能使用扩展方法对其进行扩展或从该类继承。这是扩展方法示例:

public static class MyExtensions
{
    public static void x(this aaa myClass)
    {
       // use public methods of class you are extending
       string str = myclass.a(5);
    }
}

您可以x像普通的myClass实例方法一样执行方法:

aaa myclass = new aaa();
myClass.x(); // you extension 

顺便说一句,在 C# 中,我们将 PascalNames 用于类和方法。

于 2013-06-20T14:18:00.630 回答
0

这就是继承变得有用的地方。在 c# 中的语法是:

public class myClass : aaa
{

然后你所要做的就是把你的方法放在这个类中。其他方法也同样有效。

于 2013-06-20T14:20:40.847 回答
0

如果您无法更改类,请使用扩展方法。 关联

于 2013-06-20T14:21:38.937 回答
0

两种选择:

不要写静态方法:

class Other {
  private aaa _MyClass = new aaa();
  public void x() {
    string str = _MyClass.a(5);
  }
}

将 aaa 声明为静态实例:

static aaa s_MyClass = new aaa();
public static void x() {
  string str = s_MyClass.a(5);
}
于 2013-06-20T14:25:21.167 回答
0

扩展方法的确切用例恕我直言。

您需要将行为(新方法)附加到封闭的班级权利。所以去吧:

class aaa
{
  public string a(int i)
  {
    ...
  }
  public string b (int i)
  {
    ...
  }
}

static class ExtensionContainer
{
  public static void x(this aaa myclass)
  {
    string str = myclass.a(5);
  }
}

扩展方法将像实例方法一样可调用,因此调用者提供了您需要使用的功能所需的对象。

如果你真的需要让新方法是静态的 - 那只是一个巨大的代码味道。静态方法更接近纯函数 - 并使用内部有状态对象进行实现?

如果这不是设计不良的迹象,我不知道情况,只需制作您的类(aaa)的单例并使用该对象来实现该方法。

于 2013-06-20T15:02:35.733 回答