类:定义新的数据类型以及这些新的数据类型进行相互操作的方法
定义方式:class Cat{}class Cat:object{}C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。C#中类包括:抽象类、密封类、非抽象类
abstract:表示修饰的类不完整,也就是抽象类,只能用做基类。 在使用是不能直接实例化,
不能使用new运算符。
sealed:表示修饰的类不可派生,也就是密封类。base:访问最近的基类,也就是当前类继承的类class Cat:Animal{public void Cat(){base.Eat();}}以上例子中base代表Animal。
注意:base只能在类的内部使用。接口
一个接口定义一个协定。接口可以看成是特殊的抽象类,但是又有所区别。
一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,而抽象类中可以提供定义成员的实现。
接口只指定实现该接口的类或结构必须提供的成员。接口本质上是一种类
不过他与类的区分还是很明显的——不能实例化
他的精髓在于提供一些类共同的地方,而且能“多继承”我们知道所谓对象其实是数据和方法的封装。接口的作用更多的是工程上的,一般上我们用他来封装通用的行为,来达到程序的多态。不必用object的观点来统一接口,在我的感觉中,继承简化对象结构,增加代码重用,接口抽象行为。1. 接口本质上是类吗这个,要看你认为“类的本质是什么”了,过多纠缠于这个说法,很容易陷入文字之争,意义不大。2. 接口和类有什么区别和联系,主要是联系

区别:
类的定义需要“实现”,接口的定义只需要“声明”;
类能实例化出一个对象,接口不能;
类只能单根继承,接口可以多根继承;
继承一个类,相当于借用了它已实现的功能,实现一个接口,相当于对外做了一个承诺;
……联系:类可以“实现”接口3. 接口是否具备类的特征这要看你认为哪些是“类的特征”,hehe,比如,“编译后会生成一个 .class 文件”算不算特征……4. 接口是否是Object不是。但可以用一个接口型的变量来引用一个对象,而且,被引用的对象,说到底,一定是一个 Object。1、纯虚类与接口不同的是,纯虚类可以包含一些实现
2、用纯虚类包含一些基本的功能或方法
3、用接口来定义客户端与组件之间的通讯方法
4、虚基类的实现的变化可能会影响派生类
5、使用接口要比使用继承具有更强的适用性接口的一些特征:
不可以包含任何实现;没有构造方法;任何成员都隐式声明为public;接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就是设计原则中OCP(开放封闭原则)我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个 “不能够”是指在规范原则上不应该这么做!接口的使用–多态的实现:public interface IPolimorphism(){void Say();}建立一个Class1.cs文件,定义两个类,扩展IPolimorfism:using System;using System.Windows.Forms;namespace NorthWind{public class Red:IPolimorphism  //实现接口的方法{public void Say()  //不需要指定override关键字{MessageBox.Show("Red!");}}public class Yello:IPolimorphism{public void Say() //不需要指定override关键字{MessageBox.Show("Yello!");}}}另一个MainFrm.cs文件,应用程序入口处:using System;using System.Windows.Forms;namespace NorthWind{public class MainFrm : System.Windows.Forms{[STAThread]static void Main(){IPolimorphism red  = new Red();red.Say();IPolimorphism yello = new Yello();yello.Say();}}}举个例子,有一个老汉,做了一个面饼,给了他的几个儿子,老大用这个饼,加上点馅,包一下,做成了包子,老二用这个面饼,在外面刷上油,撒上料,烤一烤,做成了土家烧饼,老三呢,胡乱做,在饼上抹上乱七八糟的东西,烤一烤,做成了披萨饼.基类和派生类的关系就是这样,基类提供了基本的实现,派生类就在上面添料,最终就成了每个人心中想要的饼.
那接口的故事则不一样,老汉没有给众人面,老汉这回给儿子们画了一个饼的设计图,规定了这个饼的厚度,直径等等,然后把这个规格表发给儿子们了,儿子们拿着画的饼,各自按自己的想法去做了.
两个故事的区别告诉我们,接口是一种规格,是一个统一的标准,在实际应用中,接口有两方法的作用.
1,通过接口更容易表现设计,更容易沟通,而且接口是没有实现代码的,因此,定好接口,再写实现代码,就算设计上有变动,也可以通过接口轻易实现修改.而如果不用接口的话,你将直接去写类,好不容易实现了一个类的代码,如果设计上有少许的变动,就要去改代码.
2.接口是写类的实现者看的,这好比建筑图纸是画给施工工人看的.

注:本文转载于http://www.cnblogs.com/Holmes-Jin/archive/2012/07/03/2574835.html

转载于:https://www.cnblogs.com/GISQZC/p/5223239.html

C#虚基类继承与接口的区别相关推荐

  1. php 虚基类,1.9 多态

    1.9 多态 返回目录 1 面向对象技术 上一节 1.8 继承 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态. ...

  2. 虚基类(c++细节篇七)

    虚基 采用虚基类的方法,可使派生类在继承间接共同基类时只保留一份成员,既减少了存储空间,也消除了成员访问的二义性. 定义格式: class 派生类名:virtual 继承方式 基类名 { 派生类新增成 ...

  3. 虚基类及其派生类的构造函数

    虚基类的概念及用法 如果派生类的全部或者部分基类有共同的基类,那么派生类的这些直接基类从上一级基类继承的成员都具有相同的名称,定义了派生类的对象后,同名数据成员就会在内存中有多份拷贝,同名函数也会有多 ...

  4. 基类、派生类、虚基类、虚函数、虚析构、纯虚函数、抽象类

    基类:被其它类通过继承方式作为父类继承的类称为基类:描述派生类的统一种类的方式. 派生类:通过继承其他类(并可能含有自定义成员)实现的子类:为提高代码的重用性及与同样继承于同一个父类的其它类形成统一种 ...

  5. C++ 多继承类 虚基类

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/jzj_c_love/article/d ...

  6. 【选择恐惧症】接口?虚基类?

    [选择恐惧症]接口?虚基类? 症前兆 症分析 症解答 症总结 症前兆 记得有个朋友跟我讨论过这样的一个问题,说到他刚刚学习接口和虚基类的相关知识时觉得很迷茫,不知道什么时候该用接口,什么时候该使用虚基 ...

  7. C++虚继承和虚基类;虚函数与继承

    ref http://blog.csdn.net/owen7500/article/details/52432970?locationNum=4&fps=1 http://blog.csdn. ...

  8. 继承与派生(Part Ⅲ)——多重继承 虚基类

    虚基类 虚基类的作用 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接 ...

  9. C++中的虚继承与虚基类

    1.Cpp中的虚继承与虚基类 在多继承时,很容易产生命名冲突的问题,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类A派 ...

  10. 虚继承c语言例子,C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}

    C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...

最新文章

  1. 单目图像深度估计 - 泛化篇:S2R-DepthNet
  2. RandomUnderSampler 中的fit_resample 是 imblearn.base.py中调用output = self._fit_resample(X, y)
  3. mysql平滑关闭_MySQL平滑删除数据的小技巧
  4. DateChooser ASP.NET 2.0版 之实用版
  5. python读取文件夹下特定的文件_python os模块获取指定文件夹下所有文件名
  6. php构造函数里抛出异常_php-在类的构造函数中返回值
  7. java 异常 过滤器_java-Spring:如何使过滤器引发自定义异常?
  8. Android日志系统Logcat源代码简要分析
  9. EMNLP 2019 丨微软亚洲研究院精选论文解读
  10. 【故障诊断分析】基于matlab FFT轴承故障诊断【含Matlab源码 1397期】
  11. 用VScode写C/C++,从下载安装到配置使用
  12. win10磁盘如何解锁bitlocker,解决分区助手无法调整分区问题
  13. php+正则匹配qq,PHP正则匹配联系方式手机号、QQ、微信、邮箱、固定电话
  14. 显卡如何超频?超多少合适?
  15. GateWay 网关服务
  16. write、read
  17. Unity程序框架总结归置系列(1)——单例基类
  18. 前端基础之CSS标签样式
  19. HTML5代码学习:值得收藏的HTML5代码段
  20. 硬核分享:优化 “Android Studio” 编译速度的10个小技巧

热门文章

  1. celery expires 让celery任务具有时效性
  2. POJ 1088 滑雪 (动规)
  3. ios7 JavaScriptCore.framework
  4. ScrumChina 2008 上海之行
  5. 如何让你的硬盘更快,系统更稳定!
  6. ubuntu常用软件安装集合:360浏览器、QQ--持续更新
  7. Linux 基础——权限管理命令chown、chgrp
  8. SSH实战 · 唯唯乐购项目(下)
  9. 不用js实现鼠标放上去改变文字内容
  10. 在Linux Redhat 9.0使用YUM