Kir*_*Yao 13 c# interface concreteclass
在一般情况下,接口或抽象类通常是适当的决定,对吗?
但在某些情况下,看起来具体类更好.例如,
public string Replace(string old, string new)
Run Code Online (Sandbox Code Playgroud)
返回具体类的Replace方法String.(这只是一个例子,虽然String没有实现任何接口.)
我的问题是
什么时候应该返回一个接口,什么时候应该返回一个具体的类?
它是program to an interface, not an implementation返回界面的一部分吗?
这取决于。
我已经看过几次这个问题,下面是一个很好的例子来说明“取决于”答案。
考虑以下类别:
public class MyClass
{
public static IEnumerable<int> Test()
{
return new List<int> { 2, 3, 4 };
}
public static List<int> Test2()
{
return new List<int> { 2, 3, 4 };
}
}
Run Code Online (Sandbox Code Playgroud)
Test返回IEnumerable并Test2返回IEnumerable接口的具体实现(List在这种情况下)。最好的方法是什么?Test还是Test2?
实际上,两者在语义上是不同的:
Test仅返回IEnumerable,这表示开发人员在枚举(foreach)中使用返回的对象是方法合同的一部分。Test2返回List实例,它允许用户访问Listby索引的对象。这是对返回对象的完全不同的利用。private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
如果希望开发人员仅在枚举中使用返回的对象,则可以将接口用作返回类型。如果希望开发人员使用接口的具体实现的方法/属性(在上面的示例中,按索引访问对象),则可以返回具体的类型。
还请记住,有时您别无选择。例如,如果您想公开应该用于Silverlight绑定的公共集合,则应返回ObservableCollection<T>,而不是IEnumerable<T>,因为绑定系统实际上需要类的method / properties / behavior ObservableCollection(IEnumerable对于绑定而言,这是不够的去工作)。
你应该避免的是,收益的方法IEnumerable<T>和用于与ToList()每次。
| 归档时间: |
|
| 查看次数: |
2084 次 |
| 最近记录: |