c#中的接口的本质和作用

c#中接口

接口的修饰符 interface
接口命名规定用大写字母 I 开头,表示是一个接口。
例如:

interface IMyText{
	int Text1();
}

1.c#中接口的本质是一个特殊的抽象类。
2.因此接口有很多东西和抽象类一致。(点击进入抽象类)
----例如:在实现接口时,必须实现接口的每一个方法但是不能使用override。
3.接口中不能有字段,构造函数,只能有属性,方法,索引器和事件。
例如:

//不能有
int num;

4.接口成员一定是公共的,但接口成员不能有任何的访问修饰符,public也不行,而且接口成员不能有任何的代码体。
例如:

interface IText
{
	int Text(); //方法
	string SayHi()//属性这个和自动属性很像但是不是自动属性
	{
		get;
		set;
	}
}

5.接口成员不能实例化,泵用static,virtual,abstract,sealed修饰。
6.接口的目的也是为了实现多态的,接口能钩实现多重继承的问题。
例如:
有一个学生类,同时想 弹吉他 和 弹钢琴 当然可以写成这样

public class Student
{
	public void PlayGuitar(){}
	public void PlayPiano(){}
}

但是这样写有一个缺点,如果再有一个类想弹吉他,弹钢琴这两个方法又需要再写一遍,但是由于继承又只能是一个。因此就需要用接口多继承。

interface IPlayGuitar//弹吉他接口
{
	void PlayGuitar();
}
interface IPlayPaino()//弹钢琴接口
{
	void PlayPaino();
}
public class Student:IPlayGuitar,IPlayPaino    //学生类
{
	public void PlayGuitar(){}
	public void PlayPaino(){}
}

这只是一个最简单的例子,接口就相当于一个规范简单,让子类实现。


7.接口的显示实现。
如果在两个接口中的方法名恰好相同并且中同一个子类中实现,这个时候我问又想区分开两个接口不一样,我们就需要显示调用接口。
例如:

interface IText1//接口一
{
	void Text();
}
interface IText2//接口二
{
	void Text();
}
public class Fun:IText1,IText2
{
	public void Text()//隐式调用
	{
		Console.WriteLine("asd123");
	}
	void IText1.Text()//显式调用IText1的方法
	{
		Console.WriteLine("asd");
	}
	void IText2.Text()//显式调用IText2的方法
	{
		Console.WriteLine("123");
	}
}

注意显式调用不能写可访问呢修饰符。
8.显示接口只能使用接口引用掉用到,而隐式接口可以使用接口引用也可以使用类来调用。
例如:

// 下面的代码和上述代码有联系
//显示接口调用
IText1 t = new IText1();//只能通过这种方式调用使用接口名
t.Text();
//隐式调用有两种调用方法
Fun f = new Fun();//方法一
f.Text();
IText2 t = new IText2();
t.Text();

显示接口很少使用,只在上面那中极为特殊的情况下使用。

<think>我们正在讨论C#接口类的区别。根据提供的引用内容,我们可以总结以下几点: 1. **定义与用途**:-类(Class)是对象的蓝图,包含数据成员(字段、属性)方法成员(方法、事件等),并可以包含实现代码。-接口(Interface)定义了一个契约,只包含成员(方法、属性、事件、索引器)的声明而不包含实现(在C#8.0之前)。接口用于指定一个类必须提供哪些成员,但不指定如何实现。 2. **实现与继承**:-类支持单继承(只能继承自一个基类),但可以实现多个接口。-接口支持多继承(一个接口可以继承多个接口),但接口本身不能实现任何成员(在C#8.0之前),C#8.0开始接口可以包含默认实现。3.**成员**:-类可以包含各种成员:字段、属性、方法、构造函数、析构函数、事件、索引器等,并且可以包含静态成员。-接口只能包含方法、属性、事件索引器的声明(在C#8.0之前),不能包含字段、构造函数、析构函数、静态成员或常量。从C#8.0开始,接口可以包含默认实现(方法体)静态成员。4.**实例化**:-类可以直接实例化(除非是抽象类)。-接口不能直接实例化,只能通过实现它的类来实例化。5.**访问修饰符**:-类的成员可以有不同的访问修饰符(public, private, protected等)。-接口的成员默认都是public的,并且不能使用访问修饰符(因为接口成员必须是可公开访问的)。 6. **抽象性**:-类可以是具体的(非抽象)或抽象的(abstract)。抽象类可以包含抽象成员(没有实现)具体成员。-接口C#8.0之前是纯抽象的(所有成员都没有实现),之后允许有默认实现。 7. **应用场景**:-类用于定义对象的类型实现。-接口用于定义行为契约,实现多态解耦。类可以实现多个接口,从而具有多种行为。 根据引用[4][5]中的例子,我们可以更具体地理解: -引用[5]中的例子展示了接口的解耦作用:`PhoneUser`类依赖于`Iphone`接口,而不是具体的手机类(如`HuaWeiPhone`或`XiaoMiPhone`)。这样,更换手机品牌时,只需要提供不同的实现类,而不需要修改`PhoneUser`类。 -引用[4]提到,C#8.0后接口功能增强,允许在接口中提供默认实现,这样实现接口的类可以选择不实现这些方法(使用默认实现),从而减少重复代码。**总结区别**:|特性|类(Class)|接口(Interface)| |--------------|--------------------------------------|--------------------------------------------------||继承|单继承(只能继承一个基类)|多继承(一个类可以实现多个接口,一个接口可以继承多个接口) ||成员|包含字段、属性、方法、事件、构造函数等,可以有实现|只能包含方法、属性、事件、索引器的声明(C#8.0前),C#8.0后可以有默认实现静态成员 ||实例化|可以直接实例化(除非抽象类)|不能直接实例化,必须由类实现| |访问修饰符|成员可以有访问修饰符|成员默认public,不能使用访问修饰符| |抽象性|可以是具体或抽象|本质是抽象契约(C#8.0后允许部分实现)| |默认实现|可以有完整的实现|在C#8.0之前没有实现,之后可以有默认实现| |构造函数|可以有|不能有||字段|可以有|不能有(但可以有属性)|**代码示例**: ```csharp//接口定义public interfaceIShape{doubleArea();//方法声明stringName {get;} //属性声明} //类实现接口publicclass Circle: IShape{public doubleRadius {get;set;}public doubleArea(){returnMath.PI* Radius* Radius;}public stringName =>"Circle"; }publicclass Rectangle: IShape{public doubleWidth {get;set;}public doubleHeight {get;set;}public doubleArea(){returnWidth *Height;}publicstring Name=> "Rectangle";} //使用classProgram{static voidMain(){IShape shape1= newCircle {Radius =5};IShapeshape2= newRectangle {Width =4, Height=6};Console.WriteLine($"{shape1.Name} area: {shape1.Area()}");Console.WriteLine($"{shape2.Name} area: {shape2.Area()}");}} ```在这个例子中,`IShape`接口定义了两个成员:一个计算面积的方法一个返回名称的属性。两个类`Circle``Rectangle`分别实现了这个接口,提供了具体的实现。通过接口,我们可以以统一的方式处理不同的形状对象。 希望这个解释示例能帮助你理解C#接口类的区别。</think>### C# 接口与类的区别详解 在 C# 中,**类(Class)** **接口(Interface)** 是面向对象编程的核心概念,它们的主要区别体现在设计目标、功能特性应用场景上。以下是详细对比: --- #### **1. 核心定义** | **特性** | **类(Class)** | **接口(Interface)** | |----------------|-------------------------------------------|------------------------------------------| | **本质** | 对象的蓝图,包含数据行为的具体实现 | 行为契约,仅定义成员签名(不包含实现)[^4] | | **实例化** | 可直接实例化(除非是抽象类) | **不能直接实例化**,必须通过实现类使用[^1] | | **继承关系** | 支持单继承(只能继承一个基类) | 支持多继承(一个类可实现多个接口)[^2] | | **成员类型** | 可包含字段、属性、方法、构造函数等完整成员 | 只能包含方法、属性、事件、索引器[^2] | --- #### **2. 成员特性对比** | **成员类型** | **类** | **接口** | |----------------|-------------------------------------------|------------------------------------------| | **方法** | 必须提供具体实现 | 仅声明签名(C#8.0 前),支持默认实现(C#8.0+)[^4] | | **属性/字段** | 可包含字段完整属性逻辑 | 只能声明属性(自动属性),**不能包含字段**[^2] | | **构造函数** | 可定义构造函数 | **不能包含构造函数** | | **访问修饰符** | 成员可指定 `public/private/protected` | 成员默认 `public`,不能添加修饰符[^2] | --- #### **3. 设计目标差异** | **场景** | **类** | **接口** | |----------------|-------------------------------------------|------------------------------------------| | **目的** | 封装具体功能逻辑数据状态 | 定义**行为规范**,实现多态解耦[^5] | | **扩展性** | 通过派生类扩展(单继承限制) | 通过多接口实现灵活组合功能 | | **典型应用** | 实现业务逻辑的核心组件(如 `FileLogger`) | 定义跨组件的契约(如 `ILogger`)[^4] | --- #### **4. 代码示例对比** ```csharp // 类(包含具体实现) public class FileLogger { private string _logPath; // 包含字段 public FileLogger(string path) { _logPath = path; } // 构造函数 public void Log(string message) => File.AppendAllText(_logPath, message); } // 接口(仅定义契约) public interface ILogger { void Log(string message); // 无实现 string LogLevel { get; set; } // 属性声明 } // 类实现接口 public class ConsoleLogger : ILogger { public string LogLevel { get; set; } public void Log(string message) => Console.WriteLine(message); // 必须实现接口成员 } ``` --- #### **5. 关键区别总结** | **维度** | **类** | **接口** | |----------------|-----------------------------|------------------------------| | **实现** | 提供完整实现 | 仅定义契约(无实现或默认实现) | | **多态支持** | 通过虚方法/抽象类 | 通过多接口实现 | | **耦合度** | 高(与具体实现绑定) | **低**(依赖抽象,解耦)[^5] | | **适用场景** | 核心业务逻辑 | 跨模块协作、插件系统、单元测试 | > **设计原则提示**: > - 优先使用接口实现**松耦合**(如依赖注入)[^5] > - 使用抽象类为派生类提供**通用基础实现** > - 接口关注 **"能做什么"**,类关注 **"如何做"** --- #### **典型应用场景** 1. **接口适用** - 定义跨层契约(如服务层 `IService`) - 实现多态(如不同支付方式 `IPayment`) - 单元测试(通过 Mock 接口替代真实实现) 2. **类适用** - 封装领域模型(如 `Order`, `User`) - 提供基础工具类(如 `FileHelper`) - 实现复杂算法逻辑 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值