最近,我有一个面试问题,显示的问题是传递参数作为其界面.现在,我一直认为你必须通过混凝土,因为没有办法知道实现哪个实例化.另外,我总是认为你“可以”返回接口……但你应该返回混凝土(同样).
问:参数化接口是个坏主意吗?
问:返回界面“没问题”?
问:如果存在多个派生,您将如何知道实例化哪个派生?
更新 – 让它更清晰
很抱歉澄清……
如果我将其发送到服务器:
– 它如何知道实例化哪个派生? (这应该失败……对吧?)
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接口的客户都可以将其传递给此方法.此外,任何使用IOrderItem的OrderItem都可以通过迭代完成.与仅使用USACustomers和USOrderItem相比,这为此方法提供了更多可能的用途,这将使您锁定这些具体类型.通过使用interfacses,您可以传递任何客户并遍历返回的OrderItem.
回答你的问题
问:参数化接口是个坏主意吗?
不,在你的场景中绝对不是一个坏主意.
问:返回界面“没问题”?
是的,返回接口只是返回实现该接口的任何类型.
问:如果存在多个派生,您将如何知道实例化哪个派生?
您可以收集对象的类型,它永远不会返回您的界面.
Type objectType = myObject.GetType();
然后,您可以根据需要投射对象. ref
object result = Convert.ChangeType(input, someOtherObject.GetType());