抽象类

一、描述

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();
        }
View Code
复制代码

(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();
        }
View Code
复制代码

(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();
        }
View Code
复制代码

(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();
        }
View Code
复制代码

(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");
        }
    }
View Code
复制代码

 

posted @   zmztyas  阅读(157)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示