最近,我有一個面試問題,顯示的問題是傳遞參數作爲其接口。現在,我一直覺得你必須通過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