C#学习——浅谈接口、抽象类、接口继承、类继承

引言: 

学习面向对象语言有一阵子了,听也听的多了,但是真正用起来的时候,还是有些陌生,这个Iworkspace,那个IworkspaceFactory还有次一级的很多,虽然我能够知道他们之间的关系,但是在应用的时候就有点迷了,所以想梳理一下。 首先这块内容,比如接口和抽象类的比较啊,什么是继承什么是多态啊很多文章都讲过,还有书本,有些也讲的挺清楚、详细,可以自己翻翻查查,我这主要就语意和用法上作主要分析。这块东西想理清楚也不容易,笔者也是只有一点点积累。代码自行思考,笔者下次补上。

  • 类?抽象类?
  • 接口?接口能实例化?
  • 异同?
  • 为什么用接口?

抽象类

  • 首先它是一个类,我觉得可以理解为一个上层的类。类是一个具有相同特征和行为的抽象,可以理解为一个复杂的数据类型。而抽象类(class 前加上 abstract)没有指出行为的具体细节,而由他的子类去实现相应的行为。
  • 还是举个最常用的例子,Animals——动物,可以定义成一个抽象类,狗、猫、小鸡、小鸟,都可继承自“动物”这个抽象类,抽象类中可以定义名称、叫声、食物这个共有的属性,奔跑、叫等公有的方法,但是具体实现它是管不到的,有类自己去丰富。
  • 抽象类和类之间的关系语意上可以这样描述:A属于B,小鸟属于动物,小狗属于动物,飞机属于交通工具……
  • 抽象类是用来继承的。

继承

继承我这里只想说一下它的作用和特点

  • 作用:共享代码,减少冗余。这点很好理解,相信很多人都听腻了。
  • 特点(缺点):很宝贵——只能继承一次,这个也可以说是优点,也可以说是缺点,我个人觉得就分类上来讲,一个东西可以归到不同的类,但是采取同一标准可以使得系统更紧凑,比如说小鸟可以继承动物、也可以继承鸟类,但是鸟类继承自动物然后小鸟再继承自鸟类就可以满足要求了。但是就行为来讲,我们就必须要继承自多个“类”才能达到目的,这就有了接口。

接口

  • 是指定一组函数成员而不实现成员的引用类型,其他类型和接口可以继承接口;
  • 要我举例的话就是小鸟和飞机都可以 Fly();
  • 接口从语意上可以视为能够,具有某种功能,接口关注的是行为,定义了 能做什么;
  • 接口是用来“实现”,稍后讲区别会提到,接口内的所有属性、方法必须被实现,所有的成员都是Public。

为什么需要接口?

我的理解是:

  • 一是解决类的单一继承的问题。还是用动物举例,可以定义一个叫的接口,一个跑的接口,一个飞的接口,小狗既可以叫又可以跑,小鸟既可以飞又可以叫。
  • 二是解决跨继承的多态问题。这又是什么意思呢,我们知道类是成体系的,比如类库,不同的很多类在c#中(最近AE窗体里更多)都属于各自的类库,类库里都包含很多很多的关系,类之间的各种联系。假如交通工具和动物属两个不同的抽象类,为了做到代码共享,我可以定义一个Fly()接口,飞机和小鸟都可以继承这个接口,各自不同的实现,这样,就做到了跨继承。

作用也就是上面的了,所以在实际当中,我们用到的很多事接口而不是抽象类,因为接口能够更好的实现继承的问题。

接口的继承

  1. 基于上述接口的特点,不仅一个类可以继承多个接口,同时接口与接口之间也可以继承没这样就使得接口的使用十分灵活(但是我觉得也有点乱,也麻烦),在《C#本质论》中,(有兴趣的图书馆好些有借),接口具“契约性”——方法集,我的理解是 接口可以理解为一个方法的系统化或者说模块化的大集合,比如下面这个图可以看到,不同接口之间的继承是有相对严格的层级关系的。
  2. 子(派生接口)接口继承了父接口,那么它就具有所有父接口提供的属性和方法,同时也可以添加自己的新的方法属性;

接口和抽象类和类的区别

其实我觉得没有必要作太多的概念上的区分,没什么意思,很多书和别的地方都列出了一二三四点什么的,有兴趣的可以自己找找看看加深理解。

1、抽象类和类都是类,类可以看做一个自定义的更加复杂的数据类型(具有属性、方法……),类实例化之后就称为对象;

2、抽象类和接口都不能实例化,接口甚至可以视为特殊的抽象类,都不能通过new直接构造一个对象,这点可能有点奇怪,因为我们好像看到了类似的写法:WHY?,所以接口可以实例化吗?

IFeatureLayer pFL = new FeatureLayerClass();

这个我也很疑惑,但是经过一番搜罗,这应该是一种省略的写法:new了一个实现接口的匿名内部类,然后new得到匿名内部类的对象再向上转型为它实现的接口(原始类型)换句话说——它实例化了一个匿名内部类,而这个类实现了这个接口。List也是一个接口,但是这个写法我相信都用过:

List<String> list = new ArrayList<>();

所以就不难理解了,对于其内部的实现,笔者目前就没有深究了,毕竟我们更多的还是以应用为主,需求驱动hh。

3、抽象类中可以有实现成员(非抽象方法),而接口中的方法只有声明没有实现;抽象类中可以有字段,接口中不能有字段,但可以有属性(字段和属性的区别要是不懂就自己查查吧),而且接口所有的方法属性都是Public;
4、抽象类,类只能单继承基类,而类可以继承多个接口;

关于类和接口方面的东西就先这样反正之后有想到可以临时添加,笔者自己理解的也不是很深,实践出真知,多敲多码吧,然后

Console.WriteLine("室友今天生日快乐!同时致谢今晚的大鱼");

嘿嘿!

代码实例(之后有机会补补):

猜你喜欢

转载自blog.csdn.net/m0_37768631/article/details/84400591