C# 接口提供了一种将实现细节和表示细节分离的方法。使用接口可以定义类应该实现的属性、方法和事件,而不需要指定它们的实现细节。接口的隐式和显式实现机制是实现接口时需要注意的地方。
隐式实现和显示实现
C# 接口有两种实现方式:隐式实现和显示实现。这两种实现方式根据实现方法的可见性和调用方式的不同而不同。
隐式实现
在隐式实现中,接口的方法和属性在实现类中的实现,与其它普通方法和属性实现方式相同。这意味着可以像普通方法一样调用实现的方法和属性,无需使用接口名称。
以下是使用隐式实现方式实现接口的示例:
interface IInterface {
void Hello();
}
class MyClass : IInterface {
public void Hello() {
Console.WriteLine("Hello World!");
}
}
在这里,MyClass
类实现了 IInterface
接口中的 Hello
方法。 Hello
方法的实现与其它普通方法的实现方式没有区别。可以在其他方法中直接调用 Hello
方法,也不需要使用接口名称。
MyClass obj = new MyClass();
obj.Hello(); // 直接调用 Hello 方法
显示实现
在显示实现中,实现类必须明确声明实现了接口。这意味着无法使用类名称直接调用实现的方法和属性。相反,必须使用接口名称来调用它们。
以下是使用显示实现方式实现接口的示例:
interface IInterface {
void Hello();
}
class MyClass : IInterface {
void IInterface.Hello() {
Console.WriteLine("Hello World!");
}
}
在这里,MyClass
类实现了 IInterface
接口中的 Hello
方法。但是,由于它是使用显示名称实现的,因此调用 Hello
方法时必须使用接口名称 IInterface
。
MyClass obj = new MyClass();
((IInterface)obj).Hello(); // 调用实现类的接口方法
适用场景
- 隐式实现通常用于不需要依赖于接口的实现,也就是说,一个类有多个实现接口的方法。
- 显示实现通常用于提供不同的实现方式,例如,同一个类实现了相同的方法但需要根据不同实现的场景来调用方法实现。
示例
隐式实现
以下示例中,定义了一个简单的数据访问类 SqlDataAccess
,它实现了两个接口:IRead
和 IWrite
。这两个接口都声明了名为 GetData
和 WriteData
的方法。之后,调用这两种方法的方式看起来与调用普通方法相同。
interface IRead {
string GetData();
}
interface IWrite {
void WriteData(string data);
}
class SqlDataAccess : IRead, IWrite {
public string GetData() {
// 从数据库获取数据
return "Data from SqlDataAccess.GetData()";
}
public void WriteData(string data) {
// 写入数据到数据库
Console.WriteLine("SqlDataAccess.WriteData: " + data);
}
}
class Program {
static void Main(string[] args) {
SqlDataAccess dataAccess = new SqlDataAccess();
string data = dataAccess.GetData();
Console.WriteLine(data);
dataAccess.WriteData("Hello World!");
}
}
显示实现
以下示例是显示实现的示例,它显示实现了 IDatabaseReader
和 IDatabaseWriter
接口。
在该示例中,两个接口都声明了名为 GetData
和 WriteData
的方法。但是,这些方法已经被明确声明为实现 IDatabaseReader
和 IDatabaseWriter
接口。在实例化时,必须使用接口名称来调用这些方法。
interface IDatabaseReader {
string GetData();
}
interface IDatabaseWriter {
void WriteData(string data);
}
class SqlDataAccess : IDatabaseReader, IDatabaseWriter {
string IDatabaseReader.GetData() {
// 从数据库获取数据
return "Data from SqlDataAccess.GetData()";
}
void IDatabaseWriter.WriteData(string data) {
// 写入数据到数据库
Console.WriteLine("SqlDataAccess.WriteData: " + data);
}
}
class Program {
static void Main(string[] args) {
SqlDataAccess dataAccess = new SqlDataAccess();
string data = ((IDatabaseReader)dataAccess).GetData();
Console.WriteLine(data);
((IDatabaseWriter)dataAccess).WriteData("Hello World!");
}
}
在这个例子中,需要使用接口名称来调用实现的方法 和 属性。需要注意的是,在该示例中,实现的方法和属性都是显式实现的,即不能通过对象实例调用。需要将对象强制转换为接口类型并调用其方法。
以上就是关于 C# 接口隐式和显示实现的攻略,希望这篇文章可以帮助您更好地理解 C# 接口的实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 接口的隐式与显示实现及适应场景 - Python技术站