类在自身内部的实例

本文关键字:实例 内部 | 更新日期: 2023-09-27 18:19:08

如果我有一个类的公共方法(不是静态的),我不能改变。
我还需要添加一些我自己的方法它们将使用现有的公共非静态方法

我怎样才能用正确的方法做这件事?

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

的例子:

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

类在自身内部的实例

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

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

你所描述的看起来非常像c#的扩展方法。在单独的static类中定义它们,并像使用实例方法一样使用它们。

听起来你真的希望你的实例方法是静态的;它从一开始就应该是静态的,因为它不依赖于使用对象的任何内部状态(因为您的新方法没有被给定、给出或重用该类型的任何实例)。你不能把它变成静态的,因为有太多的依赖关系在非静态的上下文中使用它。

如果您不能将方法更改为静态,即使它在逻辑上是静态的,那么您的解决方案确实是您在这种情况下所能做的最好的解决方案。它实际上是在非静态方法中创建一个静态"窗口"。

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

public class myClass : aaa
{

那么你所要做的就是把你的方法放在这个类中。其他方法也可以。

如果不能更改类,请使用扩展方法。链接

要调用非静态方法,必须具有要调用的实例方法的类的实例。因此,您也不能更改类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);
    }
}

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

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

顺便说一下在c#中我们使用PascalNames作为类和方法

两个选项:

不要写静态方法:

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

扩展方法的确切用例

您需要将行为(新方法)附加到一个封闭类的权利。输入:

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