2010-12-14 6 views
1

동일한 이름의 함수가있는 다른 클래스에서 인스턴스화 된 다른 객체를 전달해야하며 해당 함수를 호출하고 싶습니다. 예를 들어오류 : 'object'에 'methodName'에 대한 정의가 없습니다.

: PHP에서

Class1 object1; 
Class2 object2; 
Class3 object3; 

Object object = object1; 
object1->functionname(); 

Object object = object2; 
object2->functionname(); 

Object object = object3; 
object3->functionname(); 

이 C#에서 수 없습니다 ...

당신이 위의하지만 C#에서 난이 오류가 샘플과 같은 객체와 함께 할 단지 수있는 아주 간단 : 오류 : 'object'에 'methodName'에 대한 정의가 없습니다.

개체 개체의 모든 메서드 이름을 호출해도 문제가 없습니다. 정말 내부에 무엇이 있는지 모르기 때문에.

어떻게하면됩니까?

+3

PHP는 동적으로 (duck) 입력되며 C#은 정적으로 입력됩니다 ... –

답변

3

두 클래스가 구현하는 인터페이스를 만듭니다.
그런 다음 함수에 인터페이스의 종류를 통해 개체를 전달할 :

interface IAnimal 
{ 
    void Speak(); 
} 

class Cat : IAnimal 
{ 
    public void Speak() 
    { 
     MessageBox.Show("Meow!"); 
    } 
} 

class Dog : IAnimal 
{ 
    public void Speak() 
    { 
     MessageBox.Show("Woof!"); 
    } 
} 


static class Program 
{ 

    static void SpeakPlease(IAnimal animal) 
    { 
     animal.Speak(); 
    } 
//... 
} 
3

I though it's legal to call any method name on a object object! since it doesn't know what is really inside.

는 아니, Object 자체에 정의 된 것들로부터 떨어져 메서드를 호출하는 불법입니다. 아마도 dynamic을 생각하고 계신 겁니까?

하지만 대신 공통 인터페이스를 만들어야한다고 생각합니다.

interface IProcessable 
{ 
    void Process(); 
} 
0

C#은 정적 형식입니다. 코드가 컴파일 될 때 실행될 때가 아니라 컴파일 될 때 메서드 이름을 찾습니다. object에는 해당 메서드 이름이 없으므로 해당 함수를 호출 할 수는 없습니다.

관련 문제