2010-12-14 22 views
1

同じ名前の関数を持つ異なるクラスからインスタンス化された別のオブジェクトを渡す必要があります。例えばエラー: 'オブジェクト'に 'methodName'の定義が含まれていません

Class1 object1; 
Class2 object2; 
Class3 object3; 

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

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

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

これはC#でことはできません...

PHPで、あなたが上記のサンプルのようなオブジェクトでそれを単に行うことができますが、C#で、私はこのエラーを取得する非常に簡単です:エラー: 'object'に 'methodName'の定義が含まれていません

私はオブジェクトオブジェクトのメソッド名を呼び出すことはできますが、何が本当に内部にあるのか分からないからです。

どうすればいいですか?

+3

PHPは動的に(ダック)型付きで、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にはそのメソッド名がないため、その関数を呼び出すことはできません。

関連する問題