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. 在抽象方法声明中使用staticvirtual修饰符是错误的。
  6. 除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用abstract修饰符是错误的。
  7. 在派生类中,使用override修饰符的属性声明可以重写抽象类的继承属性。

3.抽象方法的声明

注意:抽象方法必须声明在抽象类中;声明抽象方法时,不能使用virtualstaticprivate修饰符;在方法或属性声明中使用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>
        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();
        }
    }

执行结果:
在这里插入图片描述



你学到了吗?有什么疑惑可以评论出来,共同解决!!!

  • 13
    点赞
  • 61
    收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论 6

打赏作者

Just Do Its

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值