0

我在我正在经历的代码库中找到了以下实现

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

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

现在,当我们想从这个Order对象访问最后三个方法时,我们需要做以下声明

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();

它通常在类方法与接口方法冲突或类实现具有相同方法(但目的不同)的两个接口时使用。

应谨慎使用,因为它可能表明您的班级责任过大(应分成较小的班级)。

于 2012-11-23T06:15:18.237 回答
1

考虑适配器模式Wiki - 适配器模式
当与其他应用程序或应用程序的一部分(以及许多其他要求)通信时,您不想绑定类型,因为它将在运行时决定,您可以使用这种类型的对象声明。这将创建接口类型的对象,但将分配所需类型的内存(嵌套在 switch case 中或由其他函数返回)。

 IOrder objOrder = new Order();

另一个问题是关于接口的隐式和显式实现。两者都可以在不同的场景中使用。你可以从谷歌找到更多细节。

于 2012-11-23T06:25:52.383 回答