一个非静态类如何调用另一个非静态类的方法?

5
我有两个非静态类。我需要访问一个类的方法来返回一个对象进行处理。但由于这两个类都是非静态的,所以我不能以静态方式调用该方法。也不能以非静态方式调用该方法,因为程序不知道对象的标识符。
在任何情况下,如果可能的话,我希望这两个对象保持非静态状态。否则,这将需要重新构造其余代码。
以下是示例代码:
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?
    }
}

3
我理解您的意思是希望执行类似于 new Foo().MethodToCall(); 这样的操作吧。 - atlaste
1
你需要在Bar类中创建一个Foo类的对象,然后调用该对象的实例方法。或者你可以在Bar类的方法中传递一个类型为Foo的参数。 - Habib
1
我也无法以非静态的方式调用该方法,因为程序不知道对象的名称。 - user1228
5
你知道你可以将方法设为静态但不能将类设为静态,对吗? - Alexandre Pepin
1
虽然你所问的是可能的,但几乎没有任何意义。考虑在类上添加一个静态重载。这样,您可以根据情况进行静态调用和常规调用。 - Victor Zakharov
显示剩余2条评论
4个回答

11
class Bar
{
    /*...*/

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

顺便说一下,一般情况下,物体没有名称。


这样做可以工作,但它会创建一个新的 Foo 实例,这不是我想要发生的。Foo 中的变量仍将保留在旧实例中,而新实例 x 将有一组新的变量。此外,我对术语还很陌生,我的意思是引用/标识符,而不是名称 :P - DarkDestry

2

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

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

2
为了使静态或非静态类中的任何代码调用非静态方法,调用者必须具有对进行调用的对象的引用。
在您的情况下,Bar的MethodCaller必须具有对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();
    }
}

0

试试这个:

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 实例内部进行处理。 - DarkDestry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接