C#基础之抽象类的学习
1、定义
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
2、特点
-
不能被实例化,主要用于继承
-
可以包含两种抽象成员,分别是抽象属性和抽象方法,同时可以包含其他非抽象成员
-
如果继承抽象类,则需实现抽象类的抽象属性和方法
-
不能使用Sealed关键字修饰抽象类,因为Sealed意味着类无法被继承,同时Static也不能修饰抽象类
总之,抽象类是用来继承的,而继承后的子类必须按照抽象类的遗嘱来实现遗愿,即继承抽象类中所有的抽象方法和抽象属性。
简单应用示例:
(1)定义抽象类Fruit,抽象类中有公共属性vendor,抽象属性Price和抽象方法GrowArea,代码如下:
namespace AbstractClassLearn
{
public abstract class Fruit
{
public string vendor { get; set; }
public abstract float Price { get; }
public abstract void GrowArea();
}
}
(2)定义一个继承抽象类的Apple类,代码如下:
namespace AbstractClassLearn
{
public class Apple : Fruit
{
public override float Price
{
get
{
if (vendor == "红富士")
{
return 1000;
}
else return 0;
}
}
public override void GrowArea()
{
Console.WriteLine("水果品种:" + vendor + " " + "当前价格是:" + Price);
}
}
}
(3)再定义一个继承抽象类的Orange类,代码如下:
namespace AbstractClassLearn
{
public class Orange : Fruit
{
public override float Price
{
get
{
if (vendor == "橘子") return 200;
else return 0;
}
}
public override void GrowArea()
{
Console.WriteLine("水果品种:" + vendor + " " + "当前价格是:" + Price);
}
}
}
(4)在main函数中输入:
namespace AbstractClassLearn
{
class Program
{
static void Main(string[] args)
{
Fruit f = new Apple();
f.vendor = "苹果";
f.GrowArea();
f = new Orange();
f.vendor = "橘子";
f.GrowArea();
Console.ReadKey();
}
}
}
结果如下图所示:
3、在什么情况下使用抽象类
比如说:我们需要创建 “狗”、“猫”、“马”等这些对象(类),而他们有一些共同的属性(properties)像嘴巴、尾巴、重量、颜色、大小等等,但是它们彼此的属性之间是有差异的(比如嘴巴的大小,尾巴的长短等),在这种情况下,我们如果一个个去定义各自的属性就显得比较繁琐。如果使用抽象类,则实现过程会很方便。
抽象类也有个更好的方面,那就是“同质异像”,其解释为:进行实质相同实现形式不同的方法继承,例如狗、猫、马等的呼吸方法或者奔跑速度形式不同,此时在抽象类中定义抽象方法,让他们各自继承抽象类,在抽象方法中去实现各自的形式。抽象的意义就在于:将共同的东西抽出来封装,但不实现只给继承。
4、总结
-
抽象类中的抽象属性和抽象方法必须使公有的,用public修饰符
-
子类必须重写(override)抽象类中所有抽象属性和抽象方法,如果没有全部重写,那么子类必须使抽象类
-
抽象类中可以有非抽象属性和非抽象方法,也可以是私有或者公有,但如果是私有的话,那么子类将无法访问,无意义,所以一般情况下都写为公有
-
有抽象方法或者抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的
-
抽象方法不能有函数体,只能定义,不能包含具体实现,抽象类不能被实例化,只能被继承