7

過去に投稿された同様の質問/回答を見たことがありますが、私のものは私が見た他のものとは少し異なります.

基本的に、共通のインターフェースと、それを実装/継承するいくつかのクラスがあります。次に、別のクラスに、インターフェイス IObject によって指定されたオブジェクトに作用する必要があるメソッドがあります。ただし、それぞれに異なる方法で対処する必要があるため、IObject を拡張する具象型ごとにメソッドを個別に宣言する必要があります。

class IObject
{
    ...
}

class ObjectType1 : IObject
{
    ...
}

class ObjectType2 : IObject
{
    ...
}

class FooBar
{
    void Foo (ObjectType1 obj);
    void Foo (ObjectType2 obj);
}

さて、私にとって明らかな解決策の 1 つは、メソッド Foo を個々のクラス内に配置することで動的バインディングを利用することです。これにより、実行時に正しい Foo が自動的に選択されて実行されます。ただし、これはここではオプションではありません。なぜなら、これらのオブジェクトにどのように作用するかについて複数のモデルを定義しているためです。すべてのモデルをオブジェクト クラスに詰め込むのではなく、オブジェクトを処理するための個々のモデルをそれぞれ独自のクラスにカプセル化します。 .

辞書を使用して実行時に正しいメソッド実装を動的に選択する方法を示すこの投稿を見つけました。私はこのアプローチで問題ありません。ただし、すべてのモデルで 1 回、このようなディスパッチを実行する必要があるとします。IObject とその具体的な実装しかない場合、オブジェクトの実行時の型に基づいて任意の名前のメソッドを呼び出すことができるように、このアプローチを一般化する方法はありますか?

これはおそらく不明確な質問であることは承知していますが、何か助けていただければ幸いです。

4

2 に答える 2

10

dynamicキーワードは、実際にはこれが非常に得意です。

void Main()
{
    var foobar = new FooBar();
    foreach(IObject obj in new IObject[]{ new ObjectType1(), new ObjectType2()})
    {
        foobar.Foo((dynamic)obj);
    }   
    // Output:
    //  Type 1
    //  Type 2
}

class IObject
{
}

class ObjectType1 : IObject
{
}

class ObjectType2 : IObject
{
}

class FooBar
{
    public void Foo (ObjectType1 obj) {
        Console.WriteLine("Type 1");
    }
    public void Foo (ObjectType2 obj) {
        Console.WriteLine("Type 2");
    }
}

コードは非常にシンプルで、かなりまともなパフォーマンスが得られます。

于 2013-06-10T23:15:58.427 に答える
0

インターフェイスの型を受け取るメソッドを 1 つ作成するだけで、正しい型を確認してキャストできます

ObjectType1 obj1 = new ObjectType1();

foo(obj1);

void foo(IObject fm)
        {
            ObjectType1 cls;
            if (fm is ObjectType1)
            {
                cls = fm as ObjectType1;
                cls.ID = 10;
                MessageBox.Show(cls.ID.ToString() + "    " + cls.GetType().ToString());
            } 
        }

これは、クラスが IObject を実装しているためです。cls.ID は、実装する 1 つのプロパティを配置できる単なる例です。試してみて、私に知らせてください....最高の願い。

于 2013-06-10T23:08:55.667 に答える