C#接口是一种定义契约的类型,它只包含方法、属性、事件等成员的声明,不包含具体实现,需要由类或者结构体来实现。在实际开发中,接口的调用主要分为派生类实现接口后的调用,以及外部类通过接口实例调用两种场景,下面我们通过具体示例逐一说明。

一、定义基础接口
首先我们先定义一个简单的IUser_Operation接口,包含用户信息的获取和更新两个方法声明,代码如下:
// 定义用户操作接口
public interface IUser_Operation
{
// 获取用户信息,参数为用户ID,返回用户姓名
string Get_User_Info(int user_id);
// 更新用户信息,参数为用户ID和新姓名,返回是否更新成功
bool Update_User_Info(int user_id, string new_name);
}二、派生类实现接口
接下来我们创建一个User_Service类,让它实现上面定义的IUser_Operation接口,派生类必须实现接口中声明的所有成员,否则会编译报错。
// 用户服务类,实现IUser_Operation接口
public class User_Service : IUser_Operation
{
// 模拟用户数据存储
private Dictionary<int, string> user_data = new Dictionary<int, string>
{
{1, "张三"},
{2, "李四"}
};
// 实现接口中的Get_User_Info方法
public string Get_User_Info(int user_id)
{
if (user_data.ContainsKey(user_id))
{
return user_data[user_id];
}
return "用户不存在";
}
// 实现接口中的Update_User_Info方法
public bool Update_User_Info(int user_id, string new_name)
{
if (user_data.ContainsKey(user_id))
{
user_data[user_id] = new_name;
return true;
}
return false;
}
}三、外部类调用接口方法
外部类调用接口有两种常见方式,一种是通过派生类的实例直接调用,另一种是通过接口类型的变量来调用,后者更符合面向接口编程的思想,降低代码耦合度。
3.1 通过派生类实例调用
这种方式直接创建派生类的对象,调用其实现的方法,代码如下:
public class Outer_Class
{
public void Call_By_Class_Instance()
{
// 创建User_Service类的实例
User_Service service = new User_Service();
// 调用获取用户信息方法
string user_name = service.Get_User_Info(1);
Console.WriteLine($"用户ID为1的姓名是:{user_name}");
// 调用更新用户信息方法
bool update_result = service.Update_User_Info(1, "张三_new");
Console.WriteLine($"更新结果:{update_result}");
}
}3.2 通过接口类型变量调用
这种方式将派生类实例赋值给接口类型的变量,通过接口变量调用方法,后续如果需要替换实现类,只需要修改实例化的部分,外部调用代码不需要改动。
public class Outer_Class
{
public void Call_By_Interface()
{
// 声明接口类型变量,赋值为派生类实例
IUser_Operation user_operation = new User_Service();
// 通过接口变量调用方法
string user_name = user_operation.Get_User_Info(2);
Console.WriteLine($"用户ID为2的姓名是:{user_name}");
bool update_result = user_operation.Update_User_Info(2, "李四_new");
Console.WriteLine($"更新结果:{update_result}");
}
}四、两种调用方式的对比
我们可以通过下面的表格直观看到两种调用方式的区别:
| 调用方式 | 优点 | 适用场景 |
|---|---|---|
| 派生类实例调用 | 可以直接调用派生类独有的成员,不需要额外的类型转换 | 明确只需要使用当前派生类的功能,不需要考虑后续替换实现的情况 |
| 接口类型变量调用 | 符合面向接口编程原则,降低代码耦合度,方便后续扩展替换实现类 | 需要遵循接口契约,后续可能会更换不同实现类的场景 |
五、注意事项
- 派生类实现接口时,所有接口成员都必须实现,且访问修饰符需要是
public,否则会编译失败。 - 如果派生类同时继承基类和实现接口,基类要写在前面,接口写在后面,格式为
class 派生类 : 基类, 接口1, 接口2。 - 外部类通过接口变量调用时,只能访问接口中定义的成员,无法直接访问派生类独有的成员,如果需要访问,需要进行显式类型转换。
接口的核心作用是定义统一的行为规范,让不同的实现类可以遵循相同的契约,提升代码的可维护性和扩展性,在实际开发中合理运用接口可以有效降低模块之间的耦合度。
以上就是C#接口在派生类和外部类中的完整调用方法和示例,大家可以根据自己的实际开发场景选择合适的调用方式。