我在代码库中找到了以下实现
Interface IOrder
{
GetSubmittedOrder();
CreateOrder();
GetExistingOrder();
}
Class Order : IOrder
{
BuildSpecialOrder();
AddSpecialOrderParameters();
IOrder.GetSubmittedOrder();
IOrder.CreateOrder();
IOrder.GetExistingOrder();
}
现在,当我们想要从这个Order
对象访问最后三个方法时,我们需要做以下声明
IOrder objOrder = new Order();
创建这样的实现的原因(优点)是什么?这种做法是否有特定的名称?
注意:如果这更适合程序员,请告诉我。
答案 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();
提到的另一件事是关于接口的隐式和显式实现。两者都可以在不同的场景中使用。您可以从谷歌找到更多详细信息。