实现接口只提供方法的框架。如果我们知道该方法的确切签名行,在这种情况下为
实现接口有什么要求?
这是实现接口的情况
interface IMy
{
void X();
}
public class My:IMy
{
public void X()
{
Console.WriteLine("Interface is implemented");
}
}
这是未实现接口的情况
public class My
{
public void X()
{
Console.WriteLine("No Interface is implemented ");
}
}
My obj = new My();
obj.X();
两种方法都会产生相同的结果。
实现Interface的要求是什么?
答案 0 :(得分:6)
接口的目的是允许您使用两个不同的类,就好像它们是相同的类型。在分离关注点时,这是非常宝贵的。
e.g。我可以编写一个从IDataReader读取数据的方法。我的方法不需要知道(或关心)是否是SqlDataReader,OdbcDataReader或OracleDataReader。
private void ReadData(IDataReader reader)
{
....
}
现在,假设我需要该方法来处理来自非标准数据文件的数据。我可以编写自己的对象来实现知道如何读取该文件的IDataReader,并且我的方法再次,既不知道也不关心IDataReader是如何实现的,只是它传递了一个实现IDataReader的对象。
希望这有帮助。
答案 1 :(得分:5)
您可以编写多个实现接口的类,然后将它们中的任何一个放在接口类型的变量中 这允许您在运行时交换实现。
让List<ISomeInterface>
持有不同的实现方式也很有用。
答案 2 :(得分:3)
.net中有两个继承目的:
与允许多重继承的某些语言(例如C ++)不同,.net要求每个类都有一个父类型(Object,如果没有别的话)。另一方面,有时让一个类可以替代许多不相关的类型是有用的。这就是接口的用武之地。
实现接口的对象可以替代该声明的接口类型的实例。即使对象只能从一种基类型继承,它们也可以实现任意数量的接口。因此,这允许多重继承的一些功能,而没有完全多重继承支持的复杂性和缺点。
答案 3 :(得分:2)
这是一个简单的例子,帮助我理解界面:
interface IVehicle
{
void Go();
}
public class Car:IVehicle
{
public void Go()
{
Console.WriteLine("Drive");
}
}
public class SuperCar:IVehicle
{
public void Go()
{
Console.WriteLine("Drive fast!!");
}
}
IVehicle car = new Car();
car.Go(); //output Drive
car = new SuperCar();
car.Go(); //output Drive fast!!
答案 4 :(得分:1)
您提供了一个非常基本的示例,这可能是您无法理解原因的原因。检查这样的事情:
public interface IDbColumn
{
int domainID { get; set; }
}
public static IEnumerable<T> GetDataByDomain<T>(
IQueryable<T> src) where T:IDbColumn
{
string url = HttpContext.Current.Request.Url.Host;
int i = url == "localhost" ? 1 : 2;
return src.Where(x => x.domainID == i|| x.domainID == 3);
}
domainID
是每个表中将引用此方法的物理列,但由于表类型尚不可知,因此没有接口就无法访问该变量。
答案 5 :(得分:0)
假设您有三个班级,A,B,C。
需要接受一个论点。 B或C都可以通过。
执行此操作的最佳方法是创建B和C共享的接口
答案 6 :(得分:0)
井接口并不仅仅用于一个类,它们用于许多类,以确保它们包含一组方法。
一种可视化的好方法是考虑驱动程序抽象,能够运行1个可由多个不同数据库服务器进行互操作的查询。
interface DatabaseDriver
{
public function connect(ConnectionDetails $details){}
public function disconnect(){}
public function query(Query $query){}
public function prepareQuery(SQLQuery $query){}
}
然后您的实际驱动程序将使用该接口,以便数据库对象可以确保所选驱动程序能够执行所需的任务。
class MySqlDriver extends Database implements DatabaseDriver{}
class AccessDriver extends Database implements DatabaseDriver{}
class MsSqlDriver extends Database implements DatabaseDriver{}
希望这会有所帮助。
注意:PHP中的代码