Как може нестатичен клас да извика метод на друг нестатичен клас?

Имам 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?
    }
}

person DarkDestry    schedule 15.12.2014    source източник
comment
По принцип искате да направите нещо като new Foo().MethodToCall(); предполагам...   -  person atlaste    schedule 15.12.2014
comment
Имате нужда от обект от клас Foo в Bar клас и след това извикайте метода instance върху него. Или можете да подадете параметър от тип Foo към вашия метод в Bar клас.   -  person Habib    schedule 15.12.2014
comment
Neither can I call the method in a non-static way because the program doesnt know the name of the object. wut   -  person    schedule 15.12.2014
comment
Знаете, че можете да направите метода статичен, но не и класа, нали?   -  person Alexandre Pepin    schedule 15.12.2014
comment
Въпреки че това, което питате, е възможно, едва ли има смисъл. Помислете за добавяне на статично претоварване на класа. По този начин можете да осъществите статично обаждане и обикновено повикване, в зависимост от ситуацията.   -  person Neolisk    schedule 15.12.2014
comment
Това би имало смисъл, ако всеки Foo е обект, който предвиждате, че изисква нулиране. Ако постоянно нулирате Foo, би имало смисъл да съдържате Bar във Foo, в който, когато създавате нов екземпляр, всички препратки към стария екземпляр са невалидни. Това е причината да се въздържа от използването на статични методи и класове.   -  person DarkDestry    schedule 15.12.2014
comment
възможен дубликат на Защо не мога да извикам публичен метод в друг клас?   -  person StuartLC    schedule 10.01.2015


Отговори (4)


За да може всеки код в статичен или нестатичен клас да извика нестатичен метод, извикващият трябва да има препратка към обекта, на който е направено извикването.

Във вашия случай MethodCaller на Bar трябва да има препратка към 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();
    }
}
person Sergey Kalinichenko    schedule 15.12.2014

class Bar
{
    /*...*/

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

Между другото, по принцип обектите нямат имена.

person John Saunders    schedule 15.12.2014
comment
Това ще работи, но ще създаде нов екземпляр на Foo, което не искам да се случи. Променливите във Foo ще останат в стария екземпляр, а новият екземпляр x ще има нов набор от променливи. Освен това съм нов с терминологията и искам да кажа препратка/идентификатор вместо име :P - person DarkDestry; 15.12.2014

Чрез предаване на екземпляр към конструктора:

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();
person CodeCaster    schedule 15.12.2014

Опитайте тази:

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();
    }
}
person hardydragon    schedule 15.12.2014
comment
Това ще пресъздаде нов екземпляр на Foo в лентата. Искам да обработя обекта вътре във Foo, а не в ново копие на Foo. - person DarkDestry; 15.12.2014