C#抽象类和抽象⽅法(很详细,你值得拥有)
前⾔:通过阅读这篇⽂章可以很透彻的理解C#中的抽象类和抽象⽅法,推荐刚⼊门的⼩伙伴收藏嗷
⽬录:
⼀、抽象类
1.抽象类的概念
抽象类是表⽰抽象概念的特殊类。如果⼀个类不与具体的事物相联系,⽽只是表达⼀种抽象的概念,仅仅是作为派⽣类的⼀个基类,这样的类就是抽象类。抽象类使⽤关键字abstract来定义,抽象类不能被实例化,⼀个抽象类可以同时包含抽象⽅法和⾮抽象⽅法。⽐如说动物是抽象的,狗是具体的。
abstract关键字可以和类、⽅法、属性、索引器及事件⼀起使⽤。
2.抽象类的特性
1. 抽象类不能直接实例化。并且对抽象类使⽤new运算符是编译时错误。虽然⼀些变量和值在编译时的类型可以是抽象的,但是这样的
变量和值为null,或者含有对⾮抽象类的实例的引⽤(此⾮抽象类是从抽象类派⽣的)。
2. 抽象类可以包含抽象⽅法和抽象访问器,但是⾮抽象类不可以。
3. 不能⽤sealed关键字修改抽象类,如果使⽤了sealed关键字意味着该类不能被继承。
4. 从抽象类派⽣的⾮抽象类必须重写所有抽象⽅法和抽象访问器。
3.抽象类的声明
在类声明中使⽤abstract关键字以指⽰类只能是其他类的基类。
[访问修饰符]abstract class类名
{
类成员;
}
4.抽象类的作⽤
1. 类可以实现⽆限个接⼝,但仅能从⼀个抽象(或者其他类型)类继承,从抽象类派⽣的类仍可实现接⼝,从⽽得出接⼝时⽤来处理多
重继承问题的。
2. 抽象类中可以存在⾮抽象⽅法,可接⼝不能,且接⼝⾥⾯的⽅法只是⼀个声明必须⽤public来修饰,没有具体实现⽅法。
3. 抽象类中的成员变量可以被不⼀样的修饰符来修饰,可接⼝中的成员变量默认的都是静态常量(staticfinal)
4. 抽象类是对象的抽象,接⼝是⼀种⾏为规范。
5.抽象类的使⽤场景
如果⼀个类设计的⽬点是⽤来被其它类继承的,它代表⼀类对象的所具有的公共属性或⽅法,那个这个类就应该设置为抽象类。
在实现接⼝时,常写⼀个抽象类,来实现接⼝中的某些⼦类中所需的通⽤⽅法,接着在编写各个⼦类时,即可继承该抽象类来⽤。省去在每⼀个都要实现通⽤的⽅法的困扰。
⼆、抽象⽅法
1.抽象⽅法的概念
在抽象类中也可以使⽤关键字absract定义抽象⽅法,要求所有的派⽣⾮抽象类都要重写实现抽象⽅法,引⼊抽象⽅法的原因在于抽象类本⾝是⼀种抽象概念,有的⽅法并不需要具体实现,⽽是留下来让派⽣类重写实现。抽象类中也可以声明正常⽅法。也就是说抽象⽅法不能有⽅法体,抽象类中的所有抽象⽅法必须在⼦类中重写override。
2.抽象⽅法的特性
1. 抽象⽅法是隐式的virtual⽅法(虚⽅法)。
2. 只允许在抽象类中使⽤抽象⽅法声明。
3. 因为抽象⽅法声明不提供实实现,所以没有⽅法体;⽅法声明只是以⼀个分号结束,并且在签名后没有⼤括号 ({ })。
4. 实现由overriding⽅法提供,它是⾮抽象类的成员。
5. 在抽象⽅法声明中使⽤static或virtual修饰符是错误的。
6. 除了在声明和调⽤语法上不同外,抽象属性的⾏为与抽象⽅法⼀样。在静态属性上使⽤abstract修饰符是错误的。
7. 在派⽣类中,使⽤override修饰符的属性声明可以重写抽象类的继承属性。
3.抽象⽅法的声明
注意:抽象⽅法必须声明在抽象类中;声明抽象⽅法时,不能使⽤virtual、static、private修饰符;在⽅法或属性声明中使⽤abstract修饰符以指⽰此⽅法或属性不包含实现,⽅法声明只是以⼀个分号结束,并且在签名后没有⼤括号 ({ })。
[访问修饰符]abstract返回值类型⽅法名();
三、抽象类和抽象⽅法的使⽤
例1:
当从抽象类派⽣⾮抽象类时,这些⾮抽象类必须具体实现所继承的所有抽象成员,从⽽重写那些抽象成员。
abstract class Peopole
{
//基类Peopole的抽象⽅法Run
public abstract void Run();
}
abstract class Man : Peopole
{
//因为此类为抽象类,所以不能重写基类中的抽象⽅法Run
//Peopole基类的派⽣类Man的正常⽅法Say
public void Say()
{
Console.WriteLine("Man类的正常⽅法Say");
}
}
class Son : Man
{
//因为此类为⾮抽象类,所以得重写所继承的所有抽象成员。由于抽象类Man中没有抽象⽅法,所以只重写抽象类Peopole中的抽象⽅法Run
public override void Run()
{
Console.WriteLine("重写Peopole抽象类的抽象⽅法Run");
}
}
总结:抽象类Peopole引⼊抽象⽅法Run。类Man引⼊另⼀个正常⽅法Say,但由于类Man不提供Run的实现,则类Man也必须声明为抽象类。类Son重写Run⽅法,并提供⼀个具体实现。由于类Son中没有了抽象成员,因此可以(但并⾮必须)将类Son声明为⾮抽象类。
例2:
public abstract class Person
{
/// <summary>
/// 编号
/// </summary>
public int ID {get;set;}
/// <summary>
/// 姓名
/// </summary>
writeline方法属于类
public string Name {get;set;}
/// <summary>
/// 抽象⽅法,⽤来输出信息
/// </summary>
public abstract void Getreturn();
}
public class Student:Person
{
/// <summary>
/// 重写输出信息⽅法
/
// </summary>
public override void Getreturn()
{
Console.WriteLine($"编号:{ID}---姓名:{Name}");
}
}
class Program
{
static void Main(string[] args)
{
Student stu =new Student();//实例化派⽣类Student
stu.ID =06;
stu.Name ="王⿇⼦";
stu.Getreturn();//调⽤Student类中的Getreturn⽅法
Student stu1 =new Student();//实例化派⽣类Student
Person per = stu1;//通过使⽤派⽣类对象stu1间接来实例化抽象类Person //也可以直接声明为:Person per = new Student();
per.ID =05;
per.Name ="张三";
per.Getreturn();//调⽤抽象类中的Getreturn⽅法
Console.ReadLine();
}
}
执⾏结果:
你学到了吗?有什么疑惑可以评论出来,共同解决