2014-12-15 5 views
5

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? 
    } 
} 
+3

은 기본적으로 당신이'새로운 푸() MethodToCall 같은 것을()하고 싶은; '나는 생각합니다 ... – atlaste

+1

'Bar' 클래스에'Foo' 클래스의 객체가 필요하고 그것에 대한 * instance * 메소드를 호출합니다. 또는'Foo' 타입의 매개 변수를'Bar' 클래스의 메소드에 전달할 수 있습니다. – Habib

+1

'프로그램이 객체의 이름을 알지 못하기 때문에 정적이 아닌 방법으로 메소드를 호출 할 수 없습니다. 'wut – Will

답변

2

비 정적 메소드를 호출하려면 호출자는 호출이 이루어진 객체에 대한 참조를 가져야합니다.

귀하의 경우 BarMethodCallerFoo에 대한 참조가 있어야합니다. 당신은 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 코드

을 heres 예를 들어, 일반적으로 객체는 이름이 없습니다. 생성자 인스턴스를 전달하여

+0

이것은 작동하지만 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(); 
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