2014-12-15 19 views
5

Ho 2 classi entrambe non statiche. Ho bisogno di accedere a un metodo su una classe per restituire un oggetto per l'elaborazione. Ma dal momento che entrambe le classi sono non statiche, non posso semplicemente chiamare il metodo in modo statico. Né posso chiamare il metodo in modo non statico perché il programma non conosce l'identificatore dell'oggetto.Come può una classe non statica chiamare un altro metodo di una classe non statica?

Prima di tutto, se possibile, vorrei che entrambi gli oggetti restassero non statici se possibile. Altrimenti richiederebbe molte ristrutturazioni del resto del codice.

Heres l'esempio nel codice

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

Fondamentalmente si vuole fare qualcosa di simile a 'new Foo() MethodToCall(); "Suppongo ... – atlaste

+1

Hai bisogno di un oggetto di classe' Foo' nella classe 'Bar' e poi chiama il metodo * instance * su quello. Oppure puoi passare un parametro di tipo 'Foo' al tuo metodo nella classe' Bar'. – Habib

+1

'Né posso chiamare il metodo in modo non statico perché il programma non conosce il nome dell'oggetto. Wut – Will

risposta

2

Al fine di qualsiasi codice in un statico o una classe non statica per chiamare un metodo non statico, il chiamante deve avere un riferimento all'oggetto su cui è effettuata la chiamata.

Nel tuo caso, 's MethodCaller deve avere un riferimento a Foo. Si potrebbe passare in un costruttore di Bar o in qualsiasi altro modo che ti piace:

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, in generale, gli oggetti non hanno nomi.

+0

Funzionerebbe ma creerà una nuova istanza di Foo, che non voglio accadere. Le variabili in Foo rimarrebbero nella vecchia istanza e la nuova istanza 'x' avrebbe un nuovo set di variabili. Inoltre, sono nuovo con le terminologie e intendo dire riferimento/identificatore invece del nome: P – DarkDestry

2

Passando un'istanza al costruttore:

class Bar 
{ 
    private Foo foo; 

    public Bar(Foo foo) 
    { 
     _foo = foo; 
    } 

    public void MethodCaller() 
    { 
     _foo.MethodToCall(); 
    } 
} 

utilizzati:

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

Prova questa:.

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

Questo ricreverebbe una nuova istanza di Foo all'interno di Bar. Voglio elaborare l'oggetto dentro Foo e non dentro una nuova istanza di Foo. – DarkDestry

Problemi correlati