C#中类的继承和实现多态的三种方法

本文介绍了C#中实现多态的三种方式:通过虚方法、定义抽象类以及使用接口。类继承允许子类继承父类的属性和方法,虚方法可以被子类重写以实现多态。抽象类不可实例化,但能定义抽象方法要求子类必须实现。接口则提供了一种规范,实现了接口的类必须实现接口中定义的所有方法。这些机制在C#中增强了代码的灵活性和可扩展性。
摘要由CSDN通过智能技术生成


C#实现多态的三种方法:虚方法、抽象类、接口


一、类的继承的概念

类的继承是面向对象一个非常重要的特征。这种方式在程序开发的过程中可以极大的提高代码的复用性,同时也便于拓展程序的功能。

在C#中,类的继承是指在一个现有的类的基础上去构建一个新的类,子类会自动拥有父类所有可继承的属性和方法(构建出来的新类称为子类,现有的类称为父类)

判断父类哪些属性和方法是可继承的 即是判断访问修饰符是否为public

二、定义子类实现类的继承

访问修饰符 class 子类名称:父类名称
代码如下(示例):

public class Person
    {
        //构造方法:方法名与类名一样,无返回类型
        //创建对象的时候自动执行一次
        public Person()
        {
            Console.WriteLine("PS:创建一个人的实例");
        }
    }
    
public class Student:Person
    {
        //student是子类 person是父类
        //从父类继承了成员和方法
    }

static void Main(string[] args)
    {
       //类的使用:创建他的对象实例
       Person p = new Person();
       Student s1 = new Student();
       Console.ReadKey();

    }

运行代码结果如下
在这里插入图片描述

三、实现多态的三种方式

1.定义虚方法(关键字virtual

基本结构:
访问修饰符 virtual 函数返回类型 函数名()
{
函数体
}

代码如下(示例):

public class Animal
    {
       //所有的动物会呼吸 呼吸方式不一样 定义虚方法
       //关键字virtual 派生类可以通过virtual重新定义
        public virtual void Breath()
        {
            Console.WriteLine("动物会呼吸");
        }
    }
public class Fish:Animal
    {
        //在子类中,利用重写虚方法来实现多态
        //关键字override重写virtual定义的虚方法
        public override void Breath()
        {
            //base.Breath();//执行基类的虚方法的内容
            Console.WriteLine("鱼类用腮呼吸");
        }
    }

代码运行结果:
在这里插入图片描述
基类中定义的允许在派生类中重写的方法

2.定义抽象类(关键字abstract

基本结构:
访问修饰符 abstract class 类名
{
访问修饰符 abstract 函数返回类型 方法名();//抽象成员
}

包含抽象方法的类必须声明为抽象类,但是抽象类可以不包含抽象方法,即:
访问修饰符 函数返回类型 方法名();//普通成员

代码如下(示例):

    //使用abstract定义抽象类 或抽象方法
    //只有名称的声明 而不需要具体内容
    public abstract class PaymentBase//定义支付方法基类
    {
        //制定标准 统一接入的规格
        public abstract void ProcessPayment(decimal amount);
    }

    public class WxPay:PaymentBase
    {
        //override对抽象方法abstract的重写,具体内容的定义
        public override void ProcessPayment(decimal amount)
        {
            Console.WriteLine($"微信支付:{amount:c2}");
        }
    }

代码运行结果如下:

在这里插入图片描述
抽象类不能实例化,即PaymentBase pay=new PaymentBase()是错误的;

3.接口(关键字interface)

基本格式:
访问修饰符 interface 接口名称 { }

接口名 有前缀I
接口中没有字段,没有成员属性,只有方法(不能有访问修饰符)
代码如下(示例):

    public interface ISwitch
    {
        //接口中没有字段 没有成员属性 只有方法
        //不能有访问修饰符
        void TurnOn();
        void TurnOff();
    }
    
    public class Light : ISwitch
    {
        public void TurnOff()
        {
            Console.WriteLine("关灯的操作");
        }

        public void TurnOn()
        {
            Console.WriteLine("开灯的操作");
        }
    }

代码运行结果如下:

在这里插入图片描述


总结

虚方法抽象类接口
被virtual修饰被abstract修饰被interface修饰
可以被实例化不可以被实例化不能通过实例化对象来调用接口中的方法
有方法体没有方法体没有方法体
/抽象方法可以继承一个类和实现多个接口接口只可以继承一个或多个其它接口
派生类中进行重写强制派生类实现/
  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值