本身的实例本身

时间:2013-06-20 14:15:16

标签: c# visual-studio

如果我有一个公共方法(非静态)的课程,我无法改变 我需要添加一些自己的方法来使用现有的公共非静态方法,

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

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

示例:

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

}

8 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

您所描述的内容与C#的extension methods非常相似。在单独的static类中定义它们,并将它们用作实例方法。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

要调用非静态方法,必须具有类的实例,您要调用哪种实例方法。因此,您无法更改类aaa,那么您只能使用extension methods扩展它或从该类继承。这是扩展方法示例:

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#中的 BTW 我们将PascalNames用于类和方法。

答案 4 :(得分:0)

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

public class myClass : aaa
{

然后你要做的就是把你的方法放在这个课程中。其他方法也可以。

答案 5 :(得分:0)

如果无法更改类使用扩展方法。 link

答案 6 :(得分: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);
}

答案 7 :(得分:0)

扩展方法的确切用例imho。

您需要将行为(新方法)附加到封闭类权限。所以,去吧:

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)并使用该对象来实现该方法。