2014-12-15 4 views
5

У меня есть 2 класса нестатические. Мне нужно получить доступ к методу на одном классе, чтобы вернуть объект для обработки. Но поскольку оба класса нестатические, я не могу просто вызвать метод статическим образом. Также нельзя вызвать метод нестационарным способом, потому что программа не знает идентификатора объекта.Как нестатический класс может вызвать другой метод нестатического класса?

Прежде чем что-либо, если возможно, я хочу, чтобы оба объекта оставались нестатическими, если это возможно. В противном случае потребуется большая перестройка остальной части кода.

Heres пример в коде

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

В основном вы хотите сделать что-то вроде 'новый Foo() MethodToCall(); 'Я полагаю ... – atlaste

+1

Вам нужен объект класса' Foo' в классе 'Bar', а затем вызывать метод * instance *. Или вы можете передать параметр типа 'Foo' вашему методу в классе' Bar'. – Habib

+1

'Я также могу вызвать метод нестатически, потому что программа не знает имя объекта.' Wut – Will

ответ

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(); 
    } 
} 
11
class Bar 
{ 
    /*...*/ 

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

BTW, в общем, объекты не имеют имен.

+0

Это будет работать, но это создаст новый экземпляр Foo, который я не хочу. Переменные в Foo все равно останутся в старом экземпляре, а новый экземпляр 'x' будет иметь новый набор переменных. Кроме того, im new с терминологией, и я хочу сказать reference/identifier вместо имени: 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(); 
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(); 
    } 
} 
+0

Это воссоздает новый экземпляр внутренней панели Foo. Я хочу обработать объект внутри Foo, а не внутри нового экземпляра Foo. – DarkDestry

Смежные вопросы