最近,我有一个面试问题,显示的问题是传递参数作为其接口。现在,我一直觉得你必须通过Concretes,因为没有办法知道实现哪个实例化。另外,我总是觉得你“可以”返回接口......但是你应该回归混凝土(以及)。将接口传递到RESTFUL API调用
问:参数化接口是一个坏主意吗?
问:返回接口“好吗”?
问:如果存在多个问题,您将如何知道实例化哪个派生?
更新 - 以使其更清晰
对不起,我澄清...
如果我送这个给服务器:
- 它将如何知道哪些推导实例? (这会失败,对吧?)
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);
}
}
如果有一个正确的理由有'ICustomer'或'IOrder'的多重派生(可能特定于一个'ICustomer'),那么使用通用代码没有任何问题,因此您不必重复每个具体类型。我总是尽可能在最抽象的层上运行功能来实现目标。 –
'ApiController'提供(鼓励你使用)'IHttpActionResult'的几个实现。所以可以肯定地说,返回一个接口非常好。我很好奇面试官说的是正确的? – Jonesopolis
@PrisonerZERO,你是什么意思,“你怎么知道哪个派生实例化?”? – Jonesopolis