一、抽象类的概念
抽象类(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();
}
}
}