C#学习笔记21-多态之抽象类

C#学习笔记21-多态之抽象类

  • 抽象类
  • 抽象类特点
  • 抽象类实例

抽象类

在前一篇博客C#学习笔记20-多态之虚方法中,我们提到实现多态存在有三种方法,前一篇讲解了虚方法,这一篇继续复习抽象类。当父类中的方法不知道如何去实现时,可以将父类写成抽象类,方法写成抽象类,比如小明打球,小平打球,但是他们如何打球未知,此时就可以写成抽象类来描述
抽象类,顾名思义就是一个抽象的,没有实体(没有具体实现)的类,即抽象类不能被实例化,不能创建对象。
抽象类要实现多态,需要创建抽象方法,需要加上关键字abstract,基本语法如下:

 public abstract class Animal
    {
        public abstract string Name
        {
            get;
            set;
        }
        public abstract void Bark();
    }

抽象类特点

1)抽象类不允许创建对象,对可以创建子类对象赋值给父类
假设父类为Animal、子类为Dog,则

Animal a1=new Animal();//写法错误,不能创建对象
Animal a2=new Dog();//写法正确

2)抽象类中的成员都必须标记abstract,并且不能有任何实现,抽象类中可以包含实例成员,并且抽象类中实例成员可不被子类实现
3)抽象成员必须在抽象类中,有抽象成员就必须有抽象类
4)子类继承抽象类后,必须把父类中的所有抽象成员都重写,如下

public abstract class Animal
    {
        public abstract string Name
        {
            get;
            set;
        }
        public abstract void Bark();//存在的意义让子类重写
    }
    public class Dog:Animal
    {
        public override string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

        public override void Bark()
        {
            Console.WriteLine("狗狗旺旺的叫");
        }
    }

5)抽象成员的访问修饰符不能为private
6)抽象类具有构造函数,但同样不可被实例化
7)如果父类的抽象方法中有参数,那么继承这个抽象父类的子类在重写父类的方法时必须传入对应的参数,如果抽象父类的抽象方法中有返回值,那么子类在重新这个抽象方法时也要有返回值,如下

 public abstract string Getstring(string a);
 //父类中抽象方法存在传参和返回值,子类中也要存在


如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法实现
如果父类中的方法没有默认实现,父类也不需要实例化,用抽象类实现
可以在抽象类中写虚方法,此时不需要重写,但一般不要这样写,会造成代码冗余

抽象类实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _07抽象类
{
    class Program
    {
        static void Main(string[] args)
        {
            //狗狗会叫  猫咪也会叫 
            Animal a = new Dog();
            a.Bark();
            Animal b = new Cat();
            b.Bark();
            Console.ReadKey();
        }
    }
    public abstract class Animal
    {
        public abstract string Name
        {
            get;
            set;
        }
        public abstract void Bark();//存在的意义让子类重写
    }
    public class Dog:Animal
    {
        public override string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

        public override void Bark()
        {
            Console.WriteLine("狗狗旺旺的叫");
        }
    }
    public class Cat:Animal
    {
        public override string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

        public override void Bark()
        {
            Console.WriteLine("猫咪喵喵的叫");
        }
    }

你可能感兴趣的:(C#学习笔记)