C# Interface 接口

接口:一组 对外 行为 的 规范。要求实现接口的类必须实现所有接口的成员。
(包含属性和方法,只关注行为,不关注数据,且不关注行为的实现,实现有实现类完成。)

一组:可以有多个方法,

对外:接口成员有子类实现

行为:接口中只能包含抽象的成员(方法、自动属性(无方法体),索引器,事件 ,本质都是方法。)不能有字段和构造函数。

规范:要求子类必须自行实现,否则出错。

语法格式:

public interface I.....able  //表示一种能力
{
    
}

1.接口中的成员不能添加访问修饰符(默认是public、但是不能写,  类默认是private修饰)

2.关键字:interface ,I...able(一种能力)

3.方法:(访问级别和接口相同,默认是 internal )方法返回值,方法名称(); //不能包含方法体       C#8.0可以包含方法体。

4.类与接口是多实现,必须实现所有接口的方法

---------------------------------------------------------------------------------------------------------------------------------

为了多态,接口不能被实例化,接口不能用new()创建对象。

接口不能被实例化,抽象类不能被实例化,静态类不能被实例化。

接口当中的成员不能被实例化,因为接口当中的成员没有实现。对象调用方法没有意义。

多态是为了指向子类对象。

---------------------------------------------------------------------------------------------------------------------------------

抽象类与接口的选用规则:

1.抽象类与子类是是 is a 的关系(是一种)

2.接口与实现类是 can do 的关系(能够做的功能)

3.类可以包含普通成员,接口都是抽象成员

4.类与类是单继承,接口的实现可以实现多个接口。

5.普通类可以用虚方法(可以写一点方法体)

6.抽象类是抽象方法(没有办法写方法体)

作用:

1.规范不同类型的行为,达到不同类型在行为上的一致性

2.扩展一个类已有的行为

使用方法,接口的显式实现

1.接口和接口之间可以多继承,并且可以多继承。

2.接口并不能去继承一个类,而类可以继承接口(接口只能继承接口,而类可以继承接口,也可以继承类。)

3.实现接口的成员必须实现该接口的全部成员。

4.一个类可以同时继承一个类并实现多个接口。如果一个类同时继承父类A,并实现类接口I...A那么语法上A(类)必须写在I...A(接口)的前面。

1.如果一个类实现了两个或者多个接口并且有相同的方法,显式实现接口。

      也可以强制加上接口名来显式实现接口

     (不能添加访问修饰符,默认是私有的 private )

     解决多借口实现二义性问题,解决接口中成员对实现不适用的问题。

     a.通过接口引用调用,实现类的应用。父引用,调父方法是多态的一种。

     b.通过类引用去调用,因为是私有private的,没有办法去调用(会报错)。

   (需要通过包装到另一个方法中后才能调用)

注:屏蔽多接口实现冲突。不让类来调用这个方法。

<think>我们正在讨论C#接口的使用方法和示例。根据引用,接口是一种定义方法、属性和事件的契约,实现接口的类必须提供这些成员的具体实现。接口支持多继承,有助于实现松耦合和代码扩展性。 示例1:基本接口定义和实现 引用[2]展示了接口的基本定义:使用interface关键字,并列出方法、属性和事件(无实现)。类实现接口时,必须实现所有成员。 示例2:显式与隐式实现 引用[3]提到,接口成员可以实现为公共成员(隐式实现)或通过接口名限定(显式实现)。显式实现可以避免成员名称冲突,且只能通过接口引用访问。 示例3:接口引用 引用[4]的示例演示了如何通过类对象调用方法,以及如何将类对象转换为接口引用并调用方法。 示例4:泛型接口 引用[5]展示了带泛型参数的接口。 下面我们结合这些示例,给出一个综合示例: 假设我们有两个接口:一个基本接口和一个泛型接口,并展示隐式实现、显式实现以及通过接口引用调用的方法。</think>### C# 接口使用方法及示例代码 #### 1. **接口的基本定义与实现** 接口通过 `interface` 关键字定义,包含方法、属性或事件的签名(无具体实现)。实现接口的类必须提供所有成员的具体实现: ```csharp // 定义接口 interface IAnimal { void MakeSound(); // 方法签名 string Name { get; set; } // 属性签名 } // 类实现接口 class Dog : IAnimal { public string Name { get; set; } = "Buddy"; public void MakeSound() { Console.WriteLine($"{Name} says: Woof!"); } } ``` **使用示例**: ```csharp IAnimal myDog = new Dog(); myDog.MakeSound(); // 输出: Buddy says: Woof! ``` #### 2. **显式接口实现** 当多个接口有同名成员时,使用显式实现避免冲突。显式实现的成员只能通过接口引用访问: ```csharp interface IWalker { void Move(); } interface ISwimmer { void Move(); } class Frog : IWalker, ISwimmer { // 显式实现接口 void IWalker.Move() => Console.WriteLine("Jumping"); void ISwimmer.Move() => Console.WriteLine("Swimming"); } ``` **使用示例**: ```csharp Frog frog = new Frog(); ((IWalker)frog).Move(); // 输出: Jumping ((ISwimmer)frog).Move(); // 输出: Swimming ``` #### 3. **泛型接口** 接口可定义泛型参数,增强类型安全性: ```csharp interface IRepository<T> { void Add(T item); T GetById(int id); } class UserRepository : IRepository<User> { public void Add(User user) { /* 添加用户逻辑 */ } public User GetById(int id) { /* 查询用户 */ return new User(); } } ``` #### 4. **接口的多继承** 类可同时实现多个接口: ```csharp interface ILoggable { void Log(string message); } interface ISerializable { string Serialize(); } class DataProcessor : ILoggable, ISerializable { public void Log(string msg) => Console.WriteLine($"Log: {msg}"); public string Serialize() => "Data serialized"; } ``` #### 5. **接口作为契约** 通过接口解耦依赖,提升代码扩展性: ```csharp interface IPaymentProcessor { bool ProcessPayment(decimal amount); } class PayPalProcessor : IPaymentProcessor { public bool ProcessPayment(decimal amount) { /* PayPal逻辑 */ return true; } } class OrderService { private readonly IPaymentProcessor _processor; // 依赖注入接口实现 public OrderService(IPaymentProcessor processor) => _processor = processor; public void Checkout(decimal total) { if (_processor.ProcessPayment(total)) Console.WriteLine("Payment succeeded!"); } } ``` #### 6. **接口中的事件** 接口可定义事件,由实现类触发: ```csharp interface ISensor { event EventHandler<int> TemperatureChanged; } class Thermometer : ISensor { public event EventHandler<int> TemperatureChanged; public void UpdateTemperature(int temp) { TemperatureChanged?.Invoke(this, temp); } } ``` ### 关键特性总结 1. **契约性**:强制实现类履行接口定义的行为[^1]。 2. **多态支持**:通过接口引用调用不同实现类的方法[^4]。 3. **解耦设计**:降低模块间的直接依赖,提高可测试性[^3]。 4. **显式实现**:解决命名冲突,限制成员访问方式[^3]。 > 示例完整代码可参考 .NET Fiddle 在线测试:[https://dotnetfiddle.net/](https://dotnetfiddle.net/)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值