抽象类
一、描述
1、在C#中使用关键字 abstract 来定义抽象类和抽象方法。
2、包含了一个或多个虚成员或虚方法的类叫抽象类,且不能被实例化(初始化);
3、抽象类也是类,具有类的性质。抽象类倾向于作为其他类的基类成员,或被包含进一个抽象类。
二、抽象类使用实例:(简单例子)
(1)抽象类可以包含非抽象方法或非抽象成员等,但是包含抽象方法或抽象成员等的类一定是抽象类

public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage(); } public class MyLanguage:StudyLanguage { public override void AbsLanguage() { Console.WriteLine("Please speak Abstract-Language"); } } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.AbsLanguage(); _myLanguage.EnglisthLanguage(); Console.ReadKey(); }
(2)一个非抽象类继承抽象类时,那么这个派生类必须实现所有的基类抽象方法或成员等。

public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage1(); public abstract void AbsLanguage2(); } public class MyLanguage:StudyLanguage { public override void AbsLanguage1() { Console.WriteLine("Please speak Abstract-Language1"); } public override void AbsLanguage2()//该方法若不实现,则会报错 { Console.WriteLine("Please speak Abstract-Language2"); } } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.AbsLanguage1(); _myLanguage.EnglisthLanguage(); _myLanguage.AbsLanguage2();//可以不调用 Console.ReadKey(); }
(3)通过声明派生类也是抽象的,就可以避免所有或特定的虚方法的实现,也就是抽象类的部分实现

public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage1(); public abstract void AbsLanguage2(); } public abstract class MyAbsLanguage:StudyLanguage { public override void AbsLanguage1() { Console.WriteLine("I am Studying Abstrict-Language1"); } } public class MyLanguage:MyAbsLanguage { public override void AbsLanguage2() { Console.WriteLine("I am Studying Abstrict-Language2"); } } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.AbsLanguage1(); _myLanguage.EnglisthLanguage(); _myLanguage.AbsLanguage2();//可以不调用 Console.ReadKey(); }
(4)抽象类也可以从一个接口来实现,我们必须为所有的方法(来自接口)来提供方法体(因为接口中的方法或属性都是抽象的没有实现的,所以需要重写)

interface ILanguage { void Method1(); void method2(); } public abstract class MyAbsLanguage:ILanguage { public void Method1() { Console.WriteLine("Method implemented from the IInterface1"); } public void method2()//如果去掉该方法,则会报错(因为接口有两个抽象方法) { Console.WriteLine("Method implemented from the IInterface2"); } } public class MyLanguage: MyAbsLanguage,ILanguage { //public void Method1() //{ // Console.WriteLine("1"); //} //public void method2() //{ // Console.WriteLine("2"); //} } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.Method1(); _myLanguage.method2();//可以不调用 Console.ReadKey(); }
(5)我们不能把关键字abstract 和 sealed 一起用在C#中,因为一个密封类不能够被抽象。

public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage1(); public abstract void AbsLanguage2(); } public abstract class MyAbsLanguage:StudyLanguage { public sealed override void AbsLanguage1()//当用到sealed时则在其派生类中将不再被重写 { Console.WriteLine("Do not speak AbsLanguage1"); } } public class MyLanguage: MyAbsLanguage { public override void AbsLanguage2() { Console.WriteLine("Do not speak AbsLanguage2"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现