文章目录
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修饰 |
可以被实例化 | 不可以被实例化 | 不能通过实例化对象来调用接口中的方法 |
有方法体 | 没有方法体 | 没有方法体 |
/ | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
派生类中进行重写 | 强制派生类实现 | / |