【框架设计】什么是框架的接口
什么是框架的接口
概述: 接口,对于大家都不陌生,至于何时使用,怎么使用?这里举一个例子:假如一个类A,负责传输数据。而类B,恰好是接收数据。我们还需要一个类C用来接收和传输数据。那么怎么样让A类和B类继承C呢?有的编程语言,允许多继承。子类可以继承多个父类。但是在C#中,定义不能多继承,但是可以使用多个接口。那么要继承接口就需要interface定义它ID,内部可以封装方法,但是注意,倘若你要继承ID接口,那么接口内部的所有方法属性都要实现。说到此处,不免有人问:“接口和父类继承有何区别?”.一般是泛类中的个体,即is--a的关系使用继承。如:狗是动物的一种可以使用,Class 狗:动物而接口强调是对象具有某种能力,即can--do的关系使用接口。如:大雁会飞,Class 大雁:I飞C#定义子类不许继承多个类,但是可以多个接口。如:唐老鸭是动物,它会说话,会游泳,Class 唐老鸭:动物,I说话,I游泳
C#基础系列导航
- C#实现队列读写操作(一)
- 变化多端的列表(二)
- VS自动内存管理(垃圾回收集)(三)
- C#忽略基础知识点梳理(四)
- 什么是框架的接口(五)
- 程序集的加载与反射(六)
- CLR寄宿和应用程序域(七)
- 异常(八)
类和接口继承问题:
System.Object类是所有类的根类,它定义的四个方法:ToString,Equals,CetHashCode,GetType适用于任何类。所有继承Object类的类实际继承的是方法签名base()和具体实现。
接口:实际上是为一组方法签名,指定一个方法名,不加以方法的实现。可以被多个类来继承,可以定义事件,方法,参数/无参属性。不许定义构造器方法和实例字段。提供接口必须实行所有接口中的方法。具有can--do的关系。
CLR要求接口方法标记Virtual。这样才能被派生类重写。如果不标记,默认Virtual和Sealed,阻止派生类重写方法接口。
接口方法隐式和显示实现:实例解析
接口:
internal sealed class SimpleType : IDisposable
{
//接口方法的隐式实现
public void Dispose()
{
Console.WriteLine("隐式 Dispoable");
}
//接口方法的显式实现
void IDisposable.Dispose()
{
Console.WriteLine("显式 Dispoable");
}
}
实现:
static void Main(string[] args)
{
SimpleType st = new SimpleType();
st.Dispose();
IDisposable d = st;
d.Dispose();
Console.ReadLine();
}
结果:
泛型接口问题:
IComparable<T>有一下几个好处:
1,编译时安全,可以有任意类型,若有异常通过Object类抛出。
2,操作值类型时候,不需要太多装箱,也正是比非泛型接口优化之处。性能提高。
3,可以根据参数T不同使用同一个接口若干次。代码冗杂性小,可读性高。性能提升。
对基类和接口操作的实例运用:
描述:有一个动物类,它可以派生出多个类。并且其中一个类既要实现继承又要实现接口。在控制台程序编写并输出此派生类的所有方法。
基类派生多个类,并且其中一类继承接口
//基类 public abstract class Base { public abstract void Animal(); } //派生类,继承基类和接口 public class Brid:Base,Interface1 { public override void Animal() { Console.WriteLine( "我是大雁!" ); } public void Fly() { Console.WriteLine( "我会飞!" ); } public void Say() { Console.WriteLine( "我会说话!" ); } } //派生类 public class Brid1 : Base { public override void Animal() { Console.WriteLine( "我是笨笨鸟!" ); } } |
接口的定义
interface Interface1 { void Fly(); void Say(); } |
客户端调用:
static void Main( string [] args) { Brid b1 = new Brid(); b1.Animal(); Interface1 d = b1; d.Fly(); d.Say(); Console.ReadKey(); } |
输出结果
补充:抽象类和接口多态关系实例
之前对接口做了总结,应园友需求,今天总结一下接口和抽象类的基础知识,用小的例子演示更容易理解。在演示之前我们还是把原理核心的区别了解下
相同点:
接口和抽象类都可以由子类继承的抽象成员(就是可以声明定义方法等但是不负责具体实现),接口和抽象类都不能实例化。
不同点:
接口所拥有的成员都是抽象成员,而抽象类既可以有抽象成员也可以有非抽象成员。(下面例子中,抽象类定义抽象方法和一般非抽象方法演示)
抽象类可以public和internal,但是接口一般都是public的
抽象类包含构造函数,析构函数,静态成员和常量,恰恰接口不能包含这些。
类或者抽象类只能单继承,接口可以多继承
下面描述实例的思想流程:
什么是抽象类呢?我开始想到对象是动物,后来发现动物实例大家比较熟悉。就改变门门对象即抽象类。抽象类里面有什么?我想有个抽象方法,这个跟接口一样。就在找个不一样的构造方法,还要一个抽象属性。抽象类完成了。下面继承的子类就应该是具体的了,门有很多种,我选择木门。木门中拥有抽象属性和方法的重载(就是具体属性和方法实现)。
这时候门可能还有玻璃门,铁门,金门等。这样就可以多个子类(不同材料门)继承父类(门),这就是传说的多态。下面缺接口,什么接口?之前我就说是can--do关系。我定义一个锁的接口,也可以有门铃接口。我把门铃放在锁类吧。听到门铃去开锁(开门)。这样让子类(各种材料门)继承门和锁。实现了子类继承接口和父类。多个这样类实现多态。
然后,客户端实例化两种方法。一种对子类实例(这样实例接口时候可以将子类对象附给接口),也可以实例父类(new 子类)。
综述:
就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。
接口源码:
public interface Isuo //I锁 { void MenLing(); //门铃 } |
抽象类实现继承和多态:
public abstract class 门 { protected string name; //抽象属性 public abstract string Name { get ; } //抽象方法 public abstract void Open(); //一般方法 public void Price() { Console.WriteLine( "我的门,价格好高!" ); } } //继承和多态 public class 木门 : 门, Isuo { public 木门( string myname) { name = myname; } //重载抽象属性 public override string Name { get { return name; } } //重载抽象方法 public override void Open() { Console.WriteLine(name + " 是最经济在!" ); } //实现接口方法 public void MenLing() { Console.WriteLine( "我是木门的门铃!" ); } } public class 铁门 : 门, Isuo { public 铁门( string myname) { name = myname; } //重载抽象属性 public override string Name { get { return name; } } //重载抽象方法 public override void Open() { Console.WriteLine(name + " 是结实的!" ); } //实现接口方法 public void MenLing() { Console.WriteLine( "我是铁门的门铃!" ); } } |
客户端实现
static void Main( string [] args) { 木门 men = new 木门( "木门" ); men.Open(); men.Price(); 门 men1 = new 木门( "铁门" ); men1.Open(); men1.Price(); Isuo s = men; s.MenLing(); Console.Read(); } |
运行结果:
总结:
到此接口基本定义和方法已经结束,以及使用的定义。接口多是起着内部方法的作用,有不同于类。在编程中会给你带来更多的便利和惊喜。
作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。
出处:http://www.cnblogs.com/baiboy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架