C#抽象类

一、抽象类的概念

抽象类(Abstract Class) 是一个用 abstract 关键字修饰的类。

特点:

1.不能被直接实例化
using System;
using System.Security.Cryptography;

namespace C_面向对象
{
    // 抽象类
    abstract class Thing
    {


    }

    class Water:Thing
    {

    }

    internal class Program
    {
        static void Main(string[] args)
        {
            //Thing a = new Thing();  // ❌ 编译错误:无法创建抽象类实例

            //但是遵循里氏替换原则    用父类容器装子类
            Thing t = new Water();
        }
    }
}
2.用于被继承

抽象类存在的意义是作为基类,让其他类继承它,实现代码复用和功能扩展。

3.可以包含具体实现

抽象类中可以包含已经实现的方法、属性、字段等。

4.可以定义抽象成员

强制子类必须实现特定的功能(通过抽象方法/属性)。

二、抽象函数概念

抽象函数(Abstract Method) 是用 abstract 关键字修饰的方法。

特点:

1.只有声明,没有实现

抽象方法没有方法体(没有 {}),直接以分号结尾。

2.必须存在于抽象类中

普通类不能定义抽象方法。

3.强制子类实现

子类必须用 override 关键字实现所有继承的抽象方法,否则会编译报错。

abstract class Animal {
    public abstract void MakeSound(); // 抽象方法   一定不能有函数体,且不能是私有的  
}

class Dog : Animal {
    public override void MakeSound() { // 必须实现
        Console.WriteLine("汪汪!");
    }
}
4.与虚方法的区别
abstract class Animal
{
    public abstract void MakeSound(); // 抽象方法   一定不能有函数体,且不能是私有的;    只能声明在抽象类中

    public virtual void Test()          //虚方法,也可以用override来重写, 但是可以写逻辑  虚方法可以在任何类中声明
    {
        //可以选择是否写逻辑
    }
}

class Dog : Animal
{
    public override void MakeSound()
    { // 必须实现
        Console.WriteLine("汪汪!");
    }

    //虚方法不是必须实现的
    public override void Test()
    {
        base.Test();
    }
}

class SuperDog : Dog
{
    //此时并不是必须实现的,因为Dog中已经实现了, 但是还是可以无限的重写
    public override void MakeSound()
    {
        base.MakeSound();   
    }

    public override void Test()
    {
        base.Test();
    }
}

总结

抽象类:被abstract修饰的类,不能被实例化,可以包含抽象方法。

抽象方法:没有方法体的蠢虚方法,继承后必须去实现方法。

如何选择使用抽象类或普通类:

不希望被实例化的对象,相对比较抽象的类可以使用抽象类。

父类中的行为不太需要被实现时,只希望子类去定义具体的规则,可以选择抽象类,再使用抽象方法来定义规则。

作用:

用于设计整体框架。

练习

练习一、

写一个动物抽象类,写三个子类,人叫,狗叫,猫叫。

using System;
using System.Security.Cryptography;

namespace C_面向对象
{
    #region 练习题一、写一个动物抽象类,写三个子类,人叫,狗叫,猫叫。
    abstract class Animal
    {
        public abstract void MakeSound(); // 抽象方法   一定不能有函数体,且不能是私有的;    只能声明在抽象类中
    }

    class Person : Animal
    {
        public override void MakeSound()
        {
            Console.WriteLine("你好");
        }
    }
    class Dog : Animal
    {
        public override void MakeSound()
        {
            Console.WriteLine("汪汪");
        }
    }
    class Cat : Animal
    {
        public override void MakeSound()
        {
            Console.WriteLine("喵喵");
        }
    }

    #endregion

    internal class Program
    {
        static void Main(string[] args)
        {
            Animal p = new Person();
            p.MakeSound();
            Animal d = new Dog();
            d.MakeSound();
            Animal c = new Cat();
            c.MakeSound();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值