C#中 抽象类 的使用和示例
今天学校在上Java课程时讲到使用abstract(抽象的)修饰符来修饰类使之成为抽象类,于是想到最近在学习c#,虽然说没讲到这块,但是既然Java老师给我提了一个醒,我不在C#这块拓展一下就感觉好像很对不起我们的老师,所以就在网上查阅了相关的资料文献,将C#中抽象类总结了下,下面我们就一起开始探讨吧!
abstract 修饰符
1、了解 abstract 是什么意思?
abstract 在英语中译为抽象的
2、用这个修饰符来干什么?
abstract 修饰符 修饰类名为抽象类,修饰方法为抽象方法。如果一个类为抽象类,则这个类只能是其他类的基类。抽象方法在抽象类中没有函数体,反过来说就是抽象类中的抽象方法没有方法体,直接以;分号结尾。继承抽象类的派生类必须实现抽象类的抽象方法
3、定义抽象类的目的?
定义抽象类的目的说白了其实就是:抽象类提供可由其派生类共享的一般形式,就是说共享的这一部分是公共的,但是派生类不想使用,派生类可以根据自身需求,扩展(重写)抽象类中的方法。
4、抽象类的特征:
- 抽象类不能实例化,也就说不能通过new的方法实例化
- 抽象类只能作为基类
- 抽象类的抽象方法是没有方法体的,继承抽象类的派生类必须实现抽象类的抽象方法、
- 如果一个类中包含了抽象方法,那么这个类一定要声明为抽象类
- 抽象类中的方法不一定都是抽象方法,抽象类也可以容纳具体实现的方法或者称为具体方法
5、抽象方法
- 抽象方法是隐式的虚方法
- 只允许在抽象类中使用抽象方法声明
- 抽象方法声明不提供实际实现,没有方法体,声明后以( ; )分号结束,并且在签名后没有大括号{ }
- 抽象方法一定要在派生类中重写,让抽象方法成为一个实实在在的方法,如果没有重写,那么派生类也必须是抽象类
- 抽象方法在书写时不能是私有的,也就是说不能使用private修饰符
- 在抽象方法声明不能使用static或virtual修饰符
- 在派生类中通过使用override修饰符的声明,可以重写抽象的继承方法或属性,使之称为实实在在的方法或属性
6、解释
比如说:我们要创建“狗”、“猫”、“鱼”、“马”……等这些对象,他们都有共同的一些属性,比如说嘴巴、颜色、运动、大小……等,但是他们彼此的属性又有些不同,比如说 嘴巴的形状不同吧,颜色千奇百怪吧、运动的方式不同,比如说鱼和马,一个是用腿跑,一个是用身体游。但是,在这种情况下,我们要一个个去定义各自的属性和方法?我觉得太搞笑了吧,如果说有一百种一千种动物,你要定义到何使呢。所以,在这种情况下,如果用抽象类是不是很方便给他们继承?
抽象类也有更好的地方,体现在“同质异像”,也就是说实质相同,实现形式不同的方法继承上,例如狗、鱼、马等,他们呼吸的方式不同,运动的方式以及速度上不同,这个时候,用抽象类,让各自的类去实现它门是不是就显得很方便。抽象的意义就在于此:将共同的东西抽取出来封装,但不实现,只给继承。
7、例子:
//外部调用
class Program
{
static void Main(string[] args)
{
//调用的猫的方法
Cat mao = new Cat();//实例化猫
mao.weight(20);//猫继承了体重方法,调用体重方法
mao.Eat();//调用猫的eat方法
//调用狗的方法
Dog dog1 = new Dog();//实例化狗
dog1.weight(40);
dog1.Eat();
Console.WriteLine();
}
}
//抽象类(基类)
abstract class Animal//抽象动物类
{
public int Weight { get; set; }//体重属性
public void weight(int a)//有参无返回值的普通方法
{
this.Weight = a;//将获取到的只给体重属性
Console.WriteLine("体重为:{0}", this.Weight);//打印体重
}
public abstract void Eat();//抽象方法吃,将猫和狗所具有的属性或方法抽取出来
//现实开发中,先开发父类,再开发子类
}
//派生类猫
class Cat : Animal
{
public override void Eat()//猫继承了动物吃的虚方法,但是它有自己想吃的,所以就自己重写方法
{
Console.WriteLine("我吃鱼");
}
}
//派生类狗
class Dog:Animal
{
public override void Eat()//狗继承了动物的虚方法,但是此时它有自己想吃的,所以就自己重写方法
{
Console.WriteLine("狗喜欢吃骨头");
}
}
8、在什么情况下使用抽象类?
相信大家看了上边的解释已经差不多了解到什么时候使用抽象类,但是为了保险起见,我用通俗的一句话再给大家解释一遍,来加深记忆,
如果一个类设计的目的是用来被其他类继承的,它代表一类对象的所具有的公共属性或者方法,那么此时就应该使用抽象类。
override关键字
1、了解override是什么意思?
override在英文中译为推翻、凌驾于的意思,在后端C#中译为重写的意思,就是说覆盖
2、用override关键字来干什么?
override关键字提供派生类对基类方法的新的实现,重写的基类方法必须和基类方法有着相同的签名(函数名、返回值、参数列表相同)
3、override的特点
- override关键字不可以重写基类非virtual修饰符的方法和static修饰的静态方法
- 派生类的override方法和基类的virtual方法必须有相同的访问权限,派生类不能用修饰符new、static、virtual或者abstract’修饰override方法
- 派生类的override(重写)方法重写的基类必须是virtual(虚拟的)、abstract(抽象的)或者override(重写的)
如果本篇文章有不妥的地方,或者少总结的地方,还请各位大神能够指点迷津,来帮帮我们这些技术小白,让我们有一个质的飞跃,也希望这篇文章能够帮助到更多的朋友,谢谢!