C# 的动态性多态说明

动态性多态:包含虚方法和抽象类;

一.虚方法的应用说明

虚方法是使用关键字 virtual 声明的,实现在类中定义的函数继承类的功能,虚方法可以在不同的继承类中有不同的实现,对虚方法的调用是在运行时发生的。

以下实例创建了 Shape 基类,并创建派生类 Circle、 Rectangle、Triangle, Shape 类提供一个名为 Draw 的虚拟方法,在每个派生类中重写该方法以绘制该类的指定形状。

using System;

using System.Collections.Generic;

public class Shape

{

public int X { get; private set; }

public int Y { get; private set; }

public int Height { get; set; }

public int Width { get; set; }

// 虚方法

public virtual void Draw()

{

Console.WriteLine("执行基类的画图");

}

}

class Circle : Shape

{

public override void Draw()

{

Console.WriteLine("画一个圆形");

base.Draw();

}

}

class Rectangle : Shape

{

public override void Draw()

{

Console.WriteLine("画一个长方形");

base.Draw();

}

}

class Triangle : Shape

{

public override void Draw()

{

Console.WriteLine("画一个三角形");

base.Draw();

}

}

class Program

{

static void Main(string[] args)

{

// 创建一个 List<Shape> 对象,并向该对象添加 Circle、Triangle 和 Rectangle

var shapes = new List<Shape>

{

new Rectangle(),

new Triangle(),

new Circle()

};

// 使用 foreach 循环对该列表的派生类进行循环访问,并对其中的每个 Shape 对象调用 Draw 方法

foreach (var shape in shapes)

{

shape.Draw();

}

Console.WriteLine("按下任意键退出。");

Console.ReadKey();

}

}

二.抽象类的应用说明

C# 中使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现,抽象类包含抽象方法,抽象方法可被派生类实现。

抽象类的一些规则:

2.1不能创建一个抽象类的实例;

2.2不能在一个抽象类的外部声明一个抽象方法;

2.3通过在类定义前面放置关键字 sealed ,可以将类声明为密封类 。当一个类被声明为 sealed 时,它不能被继承,抽象类不可以被声明为 sealed。

abstract class Shape

{

abstract public int area();

}

class Rectangle: Shape

{

private int length;

private int width;

public Rectangle( int a=0, int b=0)

{

length = a;

width = b;

}

public override int area ()

{

Console.WriteLine("Rectangle 类的面积:");

return (width * length);

}

}

class RectangleTester

{

static void Main(string[] args)

{

Rectangle rectangle = new Rectangle(5, 6);

double myarea = rectangle.area();

Console.WriteLine("面积: {0}",myarea);

Console.ReadKey();

}

}

三.抽象方法和虚方法的区别

3.1虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。

3.2抽象方法只能在抽象类中声明,虚方法不是。如果类包含抽象方法,那么该类也是抽象的,也必须声明类是抽象的。

3.3抽象方法必须在派生类中重写,这一点和接口类似,虚方法不需要再派生类中重写。

简单说,抽象方法是需要子类去实现的,虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。抽象方法和虚方法都可以供派生类重写。

相关推荐
Ajiang2824735304几秒前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
盼海4 分钟前
排序算法(五)--归并排序
数据结构·算法·排序算法
幽兰的天空5 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024065 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it6 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud