旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

详解C#中抽象类与接口的区分【C#.Net教程】,C#,抽象类,接口

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:45评论:0


导读:本文重要引见了C#中笼统类与接口的区分。具有很好的参考价值。下面随着小编一起来看下吧1.面向接口编程和面向对象编程是什么关联起首,面向接口编程和面向对象编程并非平级的,...
本文重要引见了C#中笼统类与接口的区分。具有很好的参考价值。下面随着小编一起来看下吧

1.面向接口编程和面向对象编程是什么关联

起首,面向接口编程和面向对象编程并非平级的,它并非比面向对象编程更先进的一种自力的编程头脑,而是附属于面向对象头脑体系,属于其一部份。或许说,它是面向对象编程体系中的头脑精华之一。

2.接口的实质

接口,在表面上是由几个没有主体代码的要领定义构成的鸠合体,有唯一的称号,可以被类或其他接口所完成(或许也可以说继续)。它在形式上多是以下的模样:

interface InterfaceName
{
 void Method1();
 void Method2(int para1);
 void Method3(string para2,string para3);
}

那末,接口的实质是什么呢?或许说接口存在的意义是什么。我以为可以从以下两个视角斟酌:

1)接口是一组划定规矩的鸠合,它划定了完成本接口的类或接口必需具有的一组划定规矩。表现了自然界“假如你是……则必需能……”的理念。

比方,在自然界中,人都能用饭,即“假如你是人,则必需能用饭”。那末模仿到计算机顺序中,就应当有一个IPerson(习惯上,接口名由“I”开首)接口,并有一个要领叫Eat(),然后我们划定,每一个示意“人”的类,必需完成IPerson接口,这就模仿了自然界“假如你是人,则必需能用饭”这条划定规矩。

从这里,我想列位也能看到些许面向对象头脑的东西。面向对象头脑的中心之一,就是模仿实在天下,把实在天下中的事物笼统成类,全部顺序靠各个类的实例互相通讯、互相合作完成体系功用,这异常相符实在天下的运行状况,也是面向对象头脑的精华。

2)接口是在肯定粒度视图上同类事物的笼统示意。注重这里我强调了在肯定粒度视图上,因为“同类事物”这个观点是相对的,它因为粒度视图差别而差别。

比方,在我的眼里,我是一个人,和一头猪有实质区分,我可以接收我和我同砚是同类这个说法,但绝不能接收我和一头猪是同类。然则,假如在一个动物学家眼里,我和猪应当是同类,因为我们都是动物,他可以以为“人”和“猪”都完成了IAnimal这个接口,而他在研讨动物行为时,不会把我和猪离开对待,而会从“动物”这个较大的粒度上研讨,但他会以为我和一棵树有实质区分。

如今换了一个遗传学家,状况又差别了,因为生物都能遗传,所以在他眼里,我不仅和猪没区分,和一只蚊子、一个细菌、一颗树、一个蘑菇以致一个SARS病毒都没什么区分,因为他会以为我们都完成了IDescendable这个接口(注:descend vi. 遗传),即我们都是可遗传的东西,他不会离别研讨我们,而会将一切生物作为同类举行研讨,在他眼里没有人和病毒之分,只需可遗传的物资和不可遗传的物资。但至少,我和一块石头照样有区分的。

可不幸的事变发生了,某日,地球上涌现了一位巨大的人,他叫列宁,他在熟读马克思、恩格斯的辩证唯物主义头脑巨著后,很有心得,因而他下了一个有名的定义:所谓物资,就是能被认识所反应的客观实在。至此,我和一块石头、一丝氛围、一条成语和传输手机信号的电磁场已没什么区分了,因为在列宁的眼里,我们都是可以被认识所反应的客观实在。假如列宁是一位顺序员,他会这么说:所谓物资,就是一切同时完成了“IReflectabe”和“IEsse”两个接口的类所生成的实例。(注:reflect v. 反应 esse n. 客观实在)

或许你会以为我上面的例子像在瞎掰,然则,这正是接口得以存在的意义。面向对象头脑和中心之一叫做多态性,什么叫多态性?说白了就是在某个粒度视图层面上对同类事物不加区分的对待而一致处置惩罚。而之所以敢如许做,就是因为有接口的存在。像谁人遗传学家,他邃晓一切生物都完成了IDescendable接口,那只如果生物,肯定有Descend()这个要领,因而他就可以一致研讨,而不至于离别研讨每一种生物而终究累死。

可以这里还不能给你一个关于接口实质和作用的直观印象。那末在后文的例子和对几个设想形式的剖析中,你将会更直观体验到接口的内在。

3.面向接口编程综述

那末什么是面向接口编程呢?我个人的定义是:在体系分析和架构中,分清条理和依靠关联,每一个条理不是直接向其上层供应效劳(即不是直接实例化在上层中),而是经由过程定义一组接口,仅向上层暴露其接口功用,上层关于基层仅仅是接口依靠,而不依靠细致类。

如许做的优点是不言而喻的,起首对体系灵活性大有优点。当基层需要转变时,只需接口及接口功用稳定,则上层没必要做任何修正。以至可以在不修改上层代码时将基层全部替代掉,就像我们将一个WD的60G硬盘换成一个希捷的160G的硬盘,计算机其他处所没必要做任何修改,而是把原硬盘拔下来、新硬盘插上就好了,因为计算机其他部份不依靠细致硬盘,而只依靠一个IDE接口,只需硬盘完成了这个接口,就可以替代上去。从这里看,顺序中的接口和实际中的接口极为类似,所以我一向以为,接口(interface)这个词用的真是神似!

运用接口的另一个优点就是差别部件或条理的开辟人员可以并行完工,就像造硬盘的没必要等造CPU的,也没必要等造显示器的,只需接口一致,设想合理,完全可以并行举行开辟,从而进步效力。

对本文的补充:

1.关于“面向接口编程”中的“接口”与细致面向对象言语中“接口”两个词

看到有朋侪提出“面向接口编程”中的“接口”二字应当比纯真编程言语中的interface局限更大。我经由思索,以为很有原理。这里我写的确切不太合理。我想,面向对象言语中的“接口”是指细致的一种代码组织,比方C#顶用interface症结字定义的接口。而“面向接口编程”中的“接口”可以说是一种从软件架构的角度、从一个更笼统的层面上指那种用于隐蔽细致底层类和完成多态性的组织部件。从这个意义上说,假如定义一个笼统类,而且目标是为了完成多态,那末我以为把这个笼统类也称为“接口”是合理的。然则用笼统类完成多态合理不合理?在下面第二条议论。

归纳综合来讲,我以为两个“接口”的观点既互相区分又互相联络。“面向接口编程”中的接口是一种头脑层面的用于完成多态性、进步软件灵活性和可维护性的架构部件,而细致言语中的“接口”是将这类头脑中的部件细致实行到代码里的手腕。

2.关于笼统类与接口

假如单从细致代码来看,对这两个观点很轻易隐约,以至以为接口就是过剩的,因为单从细致功用来看,除多重继续外(C#,Java中),笼统类好像完全能庖代接口。然则,岂非接口的存在是为了完成多重继续?固然不是。我以为,笼统类和接口的区分在于运用效果。运用笼统类是为了代码的复用,而运用接口的效果是为了完成多态性。所以,假如你在为某个处所该运用接口照样笼统类而优柔寡断时,那末可以想一想你的效果是什么。

看到有朋侪对IPerson这个接口的质疑,我个人的明白是,IPerson这个接口该不该定义,症结看细致运用中是怎样个状况。假如我们的项目中有Women和Man,都继续Person,而且Women和Man绝大多数要领都雷同,只需一个要领DoSomethingInWC()差别(例子比较粗鄙,列位包涵),那末固然定义一个AbstractPerson笼统类比较合理,因为它可以把其他一切要领都包含进去,子类只定义DoSomethingInWC(),大大减少了反复代码量。

然则,假如我们顺序中的Women和Man两个类基础没有配合代码,而且有一个PersonHandle类需要实例化他们,而且不愿望晓得他们是男是女,而只需把他们当作人对待,并完成多态,那末定义成接口就有必要了。

总而言之,接口与笼统类的区分重要在于运用的效果,而不在于其自身。而一个东西该定义成笼统类照样接口,要根据细致环境的上下文决议。

再者,我以为接口和笼统类的另一个区分在于,笼统类和它的子类之间应当是平常和特别的关联,而接口仅仅是它的子类应当完成的一组划定规矩。(固然,偶然也可以存在平常与特别的关联,但我们运用接口的目标不在这里)如,交通工具定义成笼统类,汽车、飞机、汽船定义成子类,是可以接收的,因为汽车、飞机、汽船都是一种特别的交通工具。再比方Icomparable接口,它只是说,完成这个接口的类必需要可以举行比较,这是一条划定规矩。假如Car这个类完成了Icomparable,只是说,我们的Car中有一个要领可以对两个Car的实例举行比较,多是比哪辆车更贵,也可以比哪辆车更大,这都无所谓,但我们不能说“汽车是一种特别的可以比较”,这在文法上都不通。

C#.NET内里笼统类和接口有什么区分?

接口和笼统类的观点不一样。接口是对行动的笼统,笼统类是对泉源的笼统。

笼统类示意的是,这个对象是什么。接口示意的是,这个对象能做什么。比方,男子,女人,这两个类(假如是类的话……),他们的笼统类是人。申明,他们都是人。

人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去完成它.

所以,在高等言语上,一个类只能继续一个类(笼统类)(正如人不可以同时是生物和非生物),然则可以完成多个接口(用饭接口、走路接口)。

下面接着再说说二者在运用上的区分:

接口更多的是在体系架构设想要领发挥作用,重要用于定义模块之间的通讯左券。

而笼统类在代码完成方面发挥作用,可以完成代码的重用

模板要领设想形式是笼统类的一个典范运用

最佳答案:

1笼统类

(1) 笼统要领只作声明,而不包含完成,可以看成是没有完成体的虚要领

(2) 笼统类不能被实例化

(3) 笼统类可以但不是必需有笼统属性和笼统要领,然则一旦有了笼统要领,就肯定要把这个类声明为笼统类

(4) 细致派生类必需掩盖基类的笼统要领

(5) 笼统派生类可以掩盖基类的笼统要领,也可以不掩盖。假如不掩盖,则其细致派生类必需掩盖它们。如:

using System;
public abstract class A //笼统类A 
{ 
 private int num=0;
 public int Num //笼统类包含属性 
 { 
  get 
  { 
   return num; 
  } 
  set 
  { 
   num = value; 
  }   
 }
 public virtual int getNum() //笼统类包含虚要领 
 { 
  return num; 
 }
 public void setNum(int n) // //笼统类包含一般要领 
 { 
  this.num = n; 
 }
 public abstract void E(); //类A中的笼统要领E  
}
public abstract class B : A //因为类B继续了类A中的笼统要领E,所以类B也变成了笼统类 
{
}
public class C : B 
{ 
 public override void E() //重写从类A继续的笼统要领。假如类B本身还定义了笼统要领,也必需重写 
 { 
  //throw new Exception("The method or operation is not implemented."); 
 } 
}
public class Test 
{ 
 static void Main() 
 { 
  C c = new C(); 
  c.E(); 
 } 
}

二、接 口

(1) 接口不能被实例化

(2) 接口只能包含要领声明

(3) 接口的成员包含要领、属性、索引器、事宜

(4) 接口中不能包含常量、字段(域)、组织函数、析构函数、静态成员。如:

public delegate void EventHandler(object sender, Event e);
public interface ITest 
{ 
 //int x = 0;
 int A 
 { 
  get; 
  set; 
 }
 void Test();
 event EventHandler Event; 
 int this[int index] 
 { 
  get;
  set; 
 } 
}

(5) 接口中的一切成员默以为public,因而接口中不能有private修饰符

(6) 派生类必需完成接口的一切成员

(7) 一个类可以直接完成多个接口,接口之间用逗号离隔

(8) 一个接口可以有多个父接口,完成该接口的类必需完成一切父接口中的一切成员

三、笼统类和接口

雷同点:

(1) 都可以被继续

(2) 都不能被实例化

(3) 都可以包含要领声明

(4) 派生类必需完成未完成的要领

区 别:

(1) 笼统基类可以定义字段、属性、要领完成。接口只能定义属性、索引器、事宜、和要领声明,不能包含字段。

(2) 笼统类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口老是后带able字段,证实其是表述一类“我能做。。。”

(3) 接口可以被多重完成,笼统类只能被单一继续

(4) 笼统类更多的是定义在一系列严密相干的类间,而接口大多数是关联松散但都完成某一功用的类中

(5) 笼统类是从一系列相干对象中笼统出来的观点, 因而反应的是事物的内部共性;接口是为了满足外部挪用而定义的一个功用商定, 因而反应的是事物的外部特征

(6) 接口基础上不具有继续的任何细致特性,它仅仅许诺了可以挪用的要领

(7) 接口可以用于支撑回调,而继续并不具有这个特性

(8) 笼统类完成的细致要领默以为虚的,但完成接口的类中的接口要领却默以为非虚的,固然您也可以声明为虚的

(9) 假如笼统类完成接口,则可以把接口中要领映射到笼统类中作为笼统要领而没必要完成,而在笼统类的子类中完成接口中要领

以上就是详解C#中笼统类与接口的区分的细致内容,更多请关注ki4网别的相干文章!

标签:C#抽象类接口


欢迎 发表评论: