最近,我有一个面试问题,显示的问题是传递一个参数作为它的接口(interface)。现在,我一直觉得你必须通过具体的,因为没有办法知 Prop 体化哪个实例。此外,我一直认为您“可以”返回接口(interface)……但是您应该(也)返回具体的。
问:参数化接口(interface)是个坏主意吗?
问:返回接口(interface)“可以”吗?
问:如果存在多个,您如何知道要实例化哪个派生?
更新 - 使其更加清晰
抱歉澄清...
如果我将此发送到服务器:
- 它如何知道要实例化哪个派生? (这应该会失败……对吧?)
var customer = { Name: 'Frank The Tank', Orders: [] }
$.get(url, customer, cb);
相比之下,如果我将此发送到服务器:
- 它如何知道要实例化哪个派生?
- 具体类型是否遵循? (我从来没有真正检查过)
var customer = new InsideSalesCustomer('Frank The Tank', []);
$.get(url, customer, cb);
var customer = new ExternalCustomer('Bilbo Baggins', []);
$.get(url, customer, cb);
代码示例:
public interface ICustomer
{
string Name { get; }
IEnumerable<IOrder> Orders { get; }
}
public interface IOrder
{
IEnumerable<IOrderItem> OrderItems { get; }
}
public interface IOrderItem
{
IEnumerable<IProduct> Products { get; }
}
public interface IProduct
{
string Name { get; }
}
public class CustomersController : ApiController
{
// I was always told Customer & OrderItem should be a concretes
public IEnumerable<IOrderItem> ListOrderItems(ICustomer customer)
{
// Return All OrderItems for all orders
return customer.Orders.SelectMany(o => o.OrderItems);
}
}
最佳答案
通过在这种情况下使用接口(interface),您可以实现更多的代码重用。任何使用 ICustomer
接口(interface)的客户都可以传递到此方法中。此外,任何使用 IOrderItem
的 OrderItem 都可以迭代。与仅使用 USACustomers
和 USOrderItem
相比,这为该方法提供了更多可能的用途,后者会将您锁定在这些具体类型中。通过使用接口(interface),您可以传递任何客户并循环访问返回的 OrderItem。
回答你的问题
问:参数化接口(interface)是个坏主意吗?
不,在您的场景中这绝对不是一个坏主意。
问:返回接口(interface)“正常”吗?
是的,返回接口(interface)只是返回实现该接口(interface)的任何类型。
问:如果存在多个,您如何知道要实例化哪个派生?
你可以收集对象的类型,它永远不会返回你的接口(interface)。
Type objectType = myObject.GetType();
然后您可以根据需要转换该物体。 ref
object result = Convert.ChangeType(input, someOtherObject.GetType());
关于c# - 将接口(interface)传递给 RESTFUL API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33570961/