0

私が経験しているコードベースで次の実装を見つけました

Interface IOrder
{
GetSubmittedOrder();
CreateOrder();
GetExistingOrder();
}

Class Order : IOrder
{
BuildSpecialOrder();
AddSpecialOrderParameters();
IOrder.GetSubmittedOrder();
IOrder.CreateOrder();
IOrder.GetExistingOrder();
}

ここで、このOrderオブジェクトから最後の3つのメソッドにアクセスする場合は、次の宣言を行う必要があります。

IOrder objOrder = new Order();

このような実装を作成する理由(利点)は何ですか?このプラクティスには特定の名前がありますか?

注:これがプログラマーに適しているかどうかをお知らせください。

4

3 に答える 3

3

これは明示的なインターフェイスの実装と呼ばれます。

複数のインターフェースが実装され、メソッドの名前が衝突する場合に、特定のインターフェースの実装を区別するために使用されます。

interface IOrder
{
  GetSubmittedOrder();
  CreateOrder();
  GetExistingOrder();
}

interface ISpecificOrder
{
  GetSubmittedOrder();
  CreateOrder();
  GetExistingOrder();
}

Class Order : IOrder, ISpecificOrder
{
  BuildSpecialOrder();
  AddSpecialOrderParameters();

  IOrder.GetSubmittedOrder();
  IOrder.CreateOrder();
  IOrder.GetExistingOrder();

  ISpecificOrder.GetSubmittedOrder();
  ISpecificOrder.CreateOrder();
  ISpecificOrder.GetExistingOrder();

}
于 2012-11-23T06:14:55.193 に答える
3

それは明示的なインターフェイスの実装の間違った使い方だと思います。これは基本的に、パブリック クラス コントラクトでメソッドが表示されないことを意味します。そのため、最初にオブジェクトをインターフェイス タイプにキャストする必要があります (暗黙のキャストを使用しています)。次のこともできます。

var order = (IOrder)order;
order.GetExistingOrder();

これは通常、クラス メソッドがインターフェイス メソッドと衝突する場合、またはクラスが同じメソッド (ただし目的は異なる) を持つ 2 つのインターフェイスを実装する場合に使用されます。

クラスの責任が大きすぎることを示している可能性があるため、注意して使用する必要があります (小さなクラスに分割する必要があります)。

于 2012-11-23T06:15:18.237 に答える
1

アダプターパターンを検討するWiki-アダプターパターン
のアプリケーションまたはアプリの一部(および他の多くの要件)と通信する場合、実行時に決定されるため、タイプをバインドする必要はありません。このタイプのオブジェクト宣言を使用できます。これにより、インターフェイスタイプのオブジェクトが作成されますが、必要なタイプのメモリが割り当てられます(スイッチの場合にネストされるか、他の関数によって返されます)。

 IOrder objOrder = new Order();

問題になっているもう1つのことは、インターフェースの暗黙的および明示的な実装についてです。どちらも異なるシナリオで使用できます。あなたはグーグルからより多くの詳細を見つけることができます。

于 2012-11-23T06:25:52.383 に答える