C# 之 抽象类简介

859 阅读3分钟

抽象概念

抽象:笼统,模糊,看不懂,不明白

抽象类的特点:

1.如果一个类中只存在着只有方法声明但是没有方法体(没有实现)。那么这个方法就是抽象方法。而方法所在的类一定是抽象类,这时候他们都需要abstract来修饰。

2.抽象类能不能被实例化?抽象类不能被实例化(创建对象),因为抽象方法中方法没实现。

3.抽象类必须由他的子类覆盖(重写)了抽象类中的所有抽象方法后,才可以实例化他的子类。子类必须实现所有的抽象方法

抽象类的细节:

1.抽象类中有没有构造函数?有,用于创建子类对象初始化父类用的。

2.抽象类中可以不定义抽象方法吗?可以。

3.abstract关键字不能和那些关键字共存? private sealedstatic

抽象类和普通类的区别?

相同点:

  • 抽象类和普通类有事用来描述事物的,都可以在类的内部定义任何成员(方法,属性,字段,构造函数)。

不同点:

  1. 普通类有足够的信息去描述事物,抽象类描述食物可能信息不足

  2. 普通类中不能定义抽象方法,只能定义非抽象的;抽象类两种皆可定义。

  3. 普通类可以被实例化:抽象类不能被实例化

抽象类一定是个父类吗?

是的,抽象类只有被子类继承后覆盖其所有的方法后才能实例化其子类对象

abstract classAnimal
{
    public int a = 3;
    public abstract void Eat();
}

class Dog: Animal //子类继承抽象类
{
     publicoverridevoidEat()//重新实现Eat方法
     {
          Console.WriteLine("啃骨头"+ a);
     }
}

class Demo
{ 
    static viodMain(string[]args)
    {
         newDog().Eat(); //只有实例化子类才可以调用方法
    }
}

抽象类的特点:

抽象类和抽象方法必须用abstract关键字来修饰。

抽象方法只有方法声明,没有方法体,定义在抽象类中。格式:修饰符abstract返回值类型函数名(参数列表)。

抽象类不可以被实例化,也就是不可以用new创建对象。因为抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。 抽象类通过其子类实例化,而子类需要覆盖(重写)抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。 抽象类里面可以有非抽象方法。

抽象类与普通类的区别:

  • 抽象类声明时要使用abstract关键字来定义,而普通类不需要。

  • 抽象类里的抽象方法不能有方法主体,只能有方法的声明。

  • 抽象类被继承时、子类必须重新实现它的所有抽象方法,而普通类不需要。

  • 抽象类里面大多数情况下要有抽象方法,而普通类里面一定没有抽象方法。

使用场景:

  • 当父类中的方法不知道如何实现的时候,就可以考虑将父类写成抽象类,将方法写成抽象方法,

  • 如果父类中的方法有默认实现,并且父类需要被实例化,这时可以考虑将父类定义成为一个普通类,用虚方法实现多态

  • 如果父类中的方法没有默认实现,父类也不需要被实例化,则可将该类定义为抽象类