问题描述
|
使用接口有什么用?
我听说使用它代替了多重继承,并且也可以使用它进行数据隐藏。
还有其他优势吗?places接口在哪里使用?程序员如何识别该接口?
explicit interface implementation
和implicit interface implementation
有什么区别?
解决方法
为了解决隐式/显式问题,让我们说两个不同的接口具有相同的声明:
interface IBiographicalData
{
string LastName
{
get;
set;
}
}
interface ICustomReportData
{
string LastName
{
get;
set;
}
}
您有一个实现两个接口的类:
class Person : IBiographicalData,ICustomReportData
{
private string lastName;
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
}
类Person隐式实现两个接口,因为使用以下代码可以获得相同的输出:
Person p = new p();
IBiographicalData iBio = (IBiographicalData)p;
ICustomReportData iCr = (ICustomReportData)p;
Console.WriteLine(p.LastName);
Console.WriteLine(iBio.LastName);
Console.WriteLine(iCr.LastName);
但是,要显式实现,可以像下面这样修改Person类:
class Person : IBiographicalData,ICustomReportData
{
private string lastName;
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public string ICustomReportData.LastName
{
get { return \"Last Name:\" + lastName; }
set { lastName = value; }
}
}
现在的代码:
Console.WriteLine(iCr.LastName);
将以\“ Last Name:\”为前缀。
http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and-explicit-interface-implementations.aspx
,接口对于
依赖注入
控制反转
测试隔离
,接口只是将类API的描述与其实现分开。这是关注点分离的基础,这对于任何健壮的软件项目都是至关重要的。您可以替换实现类而不破坏任何其他代码。
这对单元测试尤其有用,因为它允许您模拟不想作为给定测试用例的一部分进行测试的接口。
具有完全不相关的类实现相同的接口还使您可以编写可以在不同层次结构中的不同类上运行的方法(即,除了对象之外,没有其他共同祖先),而不必将对象作为其类型。例如,您可以编写一个采用IEnumerable的方法,并将其传递给List,Array等。如果没有接口或通用基本类型,则不可能(除非从对象进行强制转换)。
,用最基本的术语来说,我们回到OOP 101:
继承:对象B是对象A的一种类型。对象A所实现的行为和方法是对象B所继承,实现的,以及所有(还有一些覆盖的余地)。
接口:对象A和对象B都是由公共接口表示的抽象对象的“行为类似”示例。如果上面的Ienumerable可以使用James Gaunt的示例。其他示例可能是IPrintable,IDisposable等。
对于实现这些接口的任何给定类,实现的方式可能会完全不同(请考虑如何在使用dispose方法的不同类中实现IDisposable)。但是,客户端代码不需要知道或关心实际对象的类型是什么-代码可以简单地通过接口访问所需的属性和方法。
继承通常被看作是许多编码问题的“魔术”答案,但也被广泛误用于避免编写更多代码的手段。我不同意user492238的意见,即通过继承可以轻松完成接口操作。这种方法通常会使您陷入困境。而且,正如Jodrell所观察到的那样,多重继承不是.net的功能(在我看来是正确的)。
当发现自己在多个(或多个)其他不相关的类中实现相同的行为时,请考虑定义一个接口,该接口为该行为提供API。
您可能有几个类:人,动物,建筑物等,所有这些类都可能需要一种提供可打印输出的方法。您可能还具有接受IPrintableObject作为参数的方法。在这种情况下,可以在需要打印的任何类中实现IPrintableObject,在每个这些对象中提供实现代码,并将其提供给客户端代码。
,大多数(如果不是全部)接口可以完成的事情也可以通过继承来完成。接口可以用来代替使用抽象基类的类设计。首选哪个主要取决于个人经验和品味。 (当然,有些人对何时选择一个人比另一个人提出了非常严格的规定)。
并且确实存在框架(通常与DI containern结合使用),这些框架迫使您使用接口。
,接口是合同;保证指定的方法和属性将可用。它没有提供实现,这与提供实现的类有所不同。
接口是最高的抽象级别,它不向使用者提供任何实现细节。
接口在语义上几乎等效于纯抽象类(不提供任何实现的类)。在c#,vb.net和其他语言中,类可以具有多个接口,但只能有一个基类。因此,对于特定的优势,接口比类(抽象或其他)具有优势,那就是您可以实现多个接口,但只能继承一个类。
,对于更有经验的程序员,这可能是一个问题,而不是一个答案,但是...
在大多数时间里,我都与小团队一起工作,我们很亲密,彼此了解。我想知道接口的真正含义是什么。但是我的最后一个项目是与新团队合作,规模更大。那真是一团糟。一段时间后,我得出结论:我们应该使用接口。
并不是作为解决任何技术问题的方法,而是作为一种设计文档,它在代码中,迫使您遵循该设计,这种设计很难被忽略,这将使合作变得容易100倍。坐在一起并提出界面不是问题。然后,您可以单独拆分和实现内容。但是,如果您遵循界面,那么团队中的每个其他人都可以更清楚地阅读课堂思想。
因此,我最好的猜测是,接口确实是安排合作的好方法:实现所需的接口,但是接口之外没有任何公共接口,并且必须与其他相关人员一起重写接口。使代码井井有条并分隔常见内容和您唯一的内容的简便方法。