2015-11-06 59 views
3

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

如果有一個正確的理由有'ICustomer'或'IOrder'的多重派生(可能特定於一個'ICustomer'),那麼使用通用代碼沒有任何問題,因此您不必重複每個具體類型。我總是儘可能在最抽象的層上運行功能來實現目標。 –

+0

'ApiController'提供(鼓勵你使用)'IHttpActionResult'的幾個實現。所以可以肯定地說,返回一個接口非常好。我很好奇面試官說的是正確的? – Jonesopolis

+0

@PrisonerZERO,你是什麼意思,「你怎麼知道哪個派生實例化?」? – Jonesopolis

回答

2

通過在這種情況下使用接口您允許更多的代碼重用。任何使用ICustomer接口的客戶都可以傳入此方法。另外,使用IOrderItem的任何OrderItem都可以迭代。這爲您提供了更多可能的用途,而不僅僅是使用USACustomersUSOrderItem,這將鎖定您的具體類型。通過使用interfacses,您可以傳遞任何客戶並遍歷返回的OrderItem。

回答您的問題

問:參數化接口是一個壞主意?

不,這在你的情況下絕對不是一個壞主意。

問:返回接口「好嗎」?

是的,返回一個接口只是返回實現該接口的任何類型。

問:如果存在多個問題,您將如何知道實例化哪個派生?

您可以收集對象的類型,它永遠不會返回您的界面。

Type objectType = myObject.GetType(); 

然後,您可以根據需要投射對象。 ref

object result = Convert.ChangeType(input, someOtherObject.GetType()); 
+0

我更新了問題...你可以看看嗎? –

+0

沒問題,回答! –

0

這張貼,實際上將無法正常工作中的WebAPI的一切,可能已經對面試問題的目的。

爲什麼? WebAPI模型綁定器將無法找出給定的運行時類型ICustomer,因此,當您實際進入該方法時,您會看到ICustomer對象因爲在綁定過程中被跳過而僅爲null。

我只是用一個超簡單的例子自己試了一下。如果我使用ICustomer作爲我的參數類型,它總是爲空。 如果我使用Customer,一切工作正常。

能夠使用接口作爲參數通過使用自定義模型活頁夾,順便說一句,它只是不直接「開箱即用」。關於如何做到這一點有很多材料,我不會在這裏進入。