C#:接口实现

时间:2012-11-23 06:13:01

标签: c# oop design-patterns inheritance

我在代码库中找到了以下实现

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

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

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

IOrder objOrder = new Order();

创建这样的实现的原因(优点)是什么?这种做法是否有特定的名称?

注意:如果这更适合程序员,请告诉我。

3 个答案:

答案 0 :(得分:3)

它被称为explicit interface implementation

它用于区分特定接口的实现,以防多个接口实现时具有冲突的方法名称。

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

}

答案 1 :(得分:3)

我会说那是 explicit interface implementation 的错误用法。它基本上意味着这些方法在公共类合同中是不可见的。这就是为什么你必须首先将对象转换为接口类型(你使用隐式转换)。你也可以做到:

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

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

它应该小心使用,因为它可以表明你的班级责任太大(并且应该分成更小的班级)。

答案 2 :(得分:1)

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

 IOrder objOrder = new Order();

提到的另一件事是关于接口的隐式和显式实现。两者都可以在不同的场景中使用。您可以从谷歌找到更多详细信息。