C#抽象基类与接口的区别

转载 2007年09月27日 11:10:00
导读:

  定义新的数据类型以及这些新的数据类型进行相互操作的方法
  定义方式:
  
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://blog.ppku.com/?p=58 

C#与java中对抽象类、接口的继承和重写区别

C#: 一、继承 什么是继承:继承是允许重用现有类去创建新类的过程。分类的原则是一个类派生出来的子类具有这个类的所有非私有的属性。 1、继承C#中的类:C#不支持多重继承,C#类始终继承...
  • nma_123456
  • nma_123456
  • 2015年06月02日 11:39
  • 1434

浅析C#中抽象类和接口的区别

文章《浅析C#中接口的重要性》中讲述了如何声明和使用接口。但是C#具有abstract关键字形成的抽象类,那么二者我们该如何选择呢!C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函...
  • wangshubo1989
  • wangshubo1989
  • 2015年09月01日 09:00
  • 3576

C#接口和JAVA的区别?

C#接口和JAVA的区别? 接口是一种“主干类”,包含方法签名但是没有方法的实现。在这个方面,接口与抽象类一样,只包含抽象方法。C# 接口非常类似于 Java 接口,工作原理基本一样。接口的所有成员都...
  • zmhdgut
  • zmhdgut
  • 2008年08月01日 14:04
  • 3471

C# 中普通类、抽象类、接口之间的区别

一、普通类和抽象类之间的异同 1.都可以被继承 2.抽象类不能被实例化,只是用来继承的。普通类可以实例化 3.抽象方法只有含方法声明而没有方法体且必须包...
  • T_Twory
  • T_Twory
  • 2016年05月31日 09:41
  • 2004

虚基类、抽象基类和接口

虚基类 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类...
  • shejiannan
  • shejiannan
  • 2014年08月13日 11:09
  • 1590

接口和委托的区别

接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。接口(interface)是向客户承诺类或结构体的行为方式的一种合同,当实现某个接口时,相当于告诉可能的客...
  • nuaalfm
  • nuaalfm
  • 2007年08月12日 20:15
  • 6877

C#中的接口和类有什么异同。

不同点: 不能直接实例化接口。 接口不包含方法的实现。 接口可以多继承,类只能单继承。 类定义可在不同的源文件之间进行拆分。   相同点: 接口、类和结构都可以从多个接口继承。 接口类...
  • X_X_OO
  • X_X_OO
  • 2016年09月13日 20:23
  • 1859

抽象类和虚基类的定义及用途

抽象类不能实例化对象! 为了让一个类成为抽象类,至少必须有一个纯虚函数。包含至少一个纯虚函数的类视为抽象类! classA { public: virtual void lock(void)=0; ...
  • qq_32175379
  • qq_32175379
  • 2016年12月21日 19:41
  • 1727

C#和Java的区别

最开始时微软公司将Java当做一种能解决C和C++中存在的问题的语言,并不在意,并继续维持和培训着其C和C++技术和编程人员。接下来不幸的是,正当微软尽力在Visual J++基础上拓展Java功能,...
  • juelingfeng
  • juelingfeng
  • 2014年08月07日 13:19
  • 2735

流程的Python 第十一章:接口:从协议到抽象基类

前言: 抽象基类与描述符和元类一样,是用于构建框架的工具。因此,只有少数Python开发者编写的抽象基类不会对用户施加不必要的限制,让他们做无用功。目录: 内容回顾 相关资料 阅读后感 正文: 一...
  • Temanm
  • Temanm
  • 2017年08月12日 14:58
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#抽象基类与接口的区别
举报原因:
原因补充:

(最多只允许输入30个字)