【问题标题】:How can a non-static class call another non-static class's method?一个非静态类如何调用另一个非静态类的方法?
【发布时间】:2015-02-13 17:46:57
【问题描述】:

我有 2 个类都是非静态的。我需要访问一个类上的方法以返回一个对象进行处理。但由于这两个类都是非静态的,我不能只以静态方式调用该方法。我也不能以非静态方式调用该方法,因为程序不知道对象的标识符。

在任何事情之前,如果可能的话,我希望两个对象尽可能保持非静态。否则将需要对其余代码进行大量重组。

这是代码中的示例

class Foo
{
    Bar b1 = new Bar();

    public object MethodToCall(){ /*Method body here*/ }
}

Class Bar
{
    public Bar() { /*Constructor here*/ }

    public void MethodCaller()
    {
        //How can i call MethodToCall() from here?
    }
}

【问题讨论】:

  • 基本上你想做类似new Foo().MethodToCall(); 我想...
  • 您需要Bar 类中的Foo 类的对象,然后对其调用instance 方法。或者您可以将Foo 类型的参数传递给Bar 类中的方法。
  • Neither can I call the method in a non-static way because the program doesnt know the name of the object. wut
  • 你知道你可以将方法设为静态,但不能将类设为静态,对吧?
  • 即使您提出的问题是可能的,但它几乎没有任何意义。考虑在类上添加静态重载。这样,您可以根据情况进行静态调用和常规调用。

标签: c# non-static


【解决方案1】:
class Bar
{
    /*...*/

    public void MethodCaller()
    {
        var x = new Foo();
        object y = x.MethodToCall();
    }
}

顺便说一句,一般来说,对象没有名字。

【讨论】:

  • 这会起作用,但它会创建一个新的 Foo 实例,我不想发生这种情况。 Foo 中的变量仍将保留在旧实例中,而新实例 x 将具有一组新变量。另外,我是新的术语,我的意思是说参考/标识符而不是名称:P
【解决方案2】:

为了让静态或非静态类中的任何代码调用非静态方法,调用者必须具有对进行调用的对象的引用。

在您的情况下,BarMethodCaller 必须引用 Foo。你可以在Bar 的构造函数中传递它,或者以你喜欢的任何其他方式:

class Foo
{
    Bar b1 = new Bar(this);

    public object MethodToCall(){ /*Method body here*/ }
}

Class Bar
{
    private readonly Foo foo;

    public Bar(Foo foo) {
        // Save a reference to Foo so that we could use it later
        this.foo = foo;
    }

    public void MethodCaller()
    {
        // Now that we have a reference to Foo, we can use it to make a call
        foo.MethodToCall();
    }
}

【讨论】:

    【解决方案3】:

    通过将实例传递给构造函数:

    class Bar
    {
        private Foo foo;
    
        public Bar(Foo foo)
        { 
            _foo = foo;
        }
    
        public void MethodCaller()
        {
            _foo.MethodToCall();
        }
    }
    

    用法:

    Foo foo = new Foo();
    Bar bar = new Bar(foo);
    bar.MethodCaller();
    

    【讨论】:

      【解决方案4】:

      试试这个:

      class Foo
      {
          public Foo() { /*Constructor here*/ }
          Bar b1 = new Bar();
      
          public object MethodToCall(){ /*Method body here*/ }
      }
      
      Class Bar
      {
          public Bar() { /*Constructor here*/ }
          Foo f1 = new Foo();
          public void MethodCaller()
          {
              f1.MethodToCall();
          }
      }
      

      【讨论】:

      • 这将在 Bar 中重新创建一个新的 Foo 实例。我想处理 Foo 内部的对象,而不是 Foo 的新实例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多