2

それぞれが同様のプロパティを持ついくつかのC#クラスがあります。(これらはSDKの一部であり、コードを変更することはできません。)

  • Person.Name
  • 商品名
  • Order.Name

これらのクラスを多態的に使用したいのですが、共通のインターフェースを実装していないか、共通の基本クラスから派生していないため、それは不可能です。これを回避するために、共通のインターフェイスを実装する別のクラスでそれぞれをラップし、各クラスのプロパティを対応するインターフェイスのプロパティに接続します。

ラッパークラスの適切な名前は何ですか?ラッパー、デコレータ、アダプタ、プロキシ?このパターンには名前がありますか?より良いアプローチはありますか?

(動的なダックタイピングや即席のインターフェイスは使いたくありません。)

4

5 に答える 5

4

既存のインターフェースを特定の要件に適合させているため、アダプターのように見えます。

于 2013-02-18T15:24:25.133 に答える
3

(動的なダックタイピングや即席のインターフェイスは使いたくありません。)

では、NamedObjectの何が問題になっていますか?

public class NamedObject
{
    public string Name { get; set; }
}

それは文字通りそれが何であるかを言います、それ以下でもそれ以上でもありません。

于 2013-02-18T15:23:59.263 に答える
2

私はCodeCasterのアイデアに固執し、Func<T> 山かっこを使用しないと離脱症状が出る以外の理由はないかもしれません...

public class NamedEntity
{
    public string Name { get { return _getName(); } }

    private Func<string> _getName;

    public NamedObject(Func<string> getName)
    {
        _getName = getName;
    }
}

そして、このように呼び出します:

var named = new[] 
    { 
        new NamedEntity(() => person.Name),
        new NamedEntity(() => product.Name),
        new NamedEntity(() => order.Name)
    };

これによる追加の利点は、プロパティの値がターゲットオブジェクトで変更されたときに、NamedEntity参照内でもを介して変更されるFuncことです。これは、オブジェクトの存続期間内に、オブジェクトを1回ラップすることで回避できることを意味します。また、getだけでなく値を設定するsを使用して逆を実行し、Funcより多くのプロパティを適応させることもできます。

アダプターパターン(ラッパーパターンの一種)を推測しますが、これがどのパターンを表しているのか(ある場合)はすぐにはわかりません。ただし、プロキシパターンであると主張することもできます。よくわかりません。

于 2013-02-18T15:28:50.457 に答える
1

名前空間を変更して、元のクラスの名前を保持できるかもしれません。

于 2013-02-18T15:27:47.477 に答える
1

技術的には、最も正しい名前はアダプターだと思います。この質問を参照してください。

アダプタは、抽象インターフェイスがあり、そのインターフェイスを、同様の機能的役割を持つがインターフェイスが異なる別のオブジェクトにマップする場合に使用されます。

あなたは抽象的なインターフェースを持っていませんが、「同様の機能的役割ですが、異なるインターフェース」を持っています。

于 2013-02-18T15:31:06.593 に答える