1.抽象类
1.1什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类是不完整的,它只能用作基类。是对一系列看上去不同,但是本质上相同的具体概念的抽象。例如:
定义一个水果抽象类,(子类继承抽象类,需要重写抽象类中的抽象属性和抽象方法,如果没有override,则子类虚为抽象类)
public abstract class Fruit
{
public string vendor { get; set; } //默认为private
public abstract float Price { get; } //抽象属性必须是公有的
public abstract void GrowInArea(); //抽象方法必须是公有的
}
//定义一个苹果类,继承水果类
public class Apple : Fruit
{
public override float Price
{
get
{
if (vendor == "红富士")
return 100;
else
return 0;
}
}
public override void GrowInArea()
{
Console.WriteLine("我在南方北方都能生长,我的生产商是:" + vendor + ",我现在的价格是:" + Price);
}
}
1.2、为什么使用抽象类
- 代码重用,继承类都能用抽象类定义的方法
- 灵活,某个继承类既可以继承改方法也可以派生一个新的
- 抽象类是所有继承类通用方法的最小集合,可以封装某一个继承类的实例用来进行传递
2.接口
2.1、什么是接口:
在日常生活中,手机、笔记本电脑、平板电脑等电子产品提供了不同类型的接口用于充电或者连接不同的设备。
不同类型接口的标准不一样,例如电压、尺寸等。
在C#语言中,接口也会定义一种标准,如果需要使用接口,必须满足接口中所定义的内容。(1.接口是一种规范;2.接口需要被实现;3.接口包含方法、属性、索引器和事件)
通常是以 I 开头,再加上其他的单词构成。例如创建一个计算的接口,可以命名为 ICompute。接口声明的方式与声明类的方式相似,但使用的关键字是interface,而不是 class。
接口中定义的成员必须满足以下要求:
- 接口中的成员不允许使用 public、private、protected、internal 访问修饰符。
- 接口中的成员不允许使用 static、virtual、abstract、sealed 修饰符。
- 在接口中不能定义字段。
- 在接口中定义的方法不能包含方法体。
2.2、为什么使用接口
在C#语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。
一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。
3、抽象类与接口比较
抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。
接口是引用类型的,和抽象类的相似之处有三点:
抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上:
-
类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
-
抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
-
抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。
-
抽象类是对象的抽象,然而接口是一种行为规范。