C# 面向对象(多态)
c# 面向对象 多态
2023-09-11 14:20:51 时间
在类的继承中,c#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中有不同的事项方法,从而为解决同一问题提供多种途径。
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:
- 函数重载
- 运算符重载
动态多态性
C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。
请注意,下面是有关抽象类的一些规则:
- 您不能创建一个抽象类的实例。
- 您不能在一个抽象类外部声明一个抽象方法。
- 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
多态的出现提高了代码复用性,扩展性,使后期维护更加方便。
多态的弊端:前期定义的内容不能使用(调用)后期子类中的特有内容
使用多态的前提:
1.想让一个事物具备另一种形态,一定有继承关系(实现)
2.要有覆盖。操作父类型。
多态中的成员:
Fu f=new Zi();
f.show;
变量:
父类形指向子类对象,调用的是父类的变量
编译时:参考变量的类型中是否有调用的成员变量,如果有就通过编译,没有就报错
运行时:参考变量的类型中是否有调用成员变量,如果没有就运行该类中的变量
简单说:编译和运行都看等号左边。
方法:
编译时:参考靠变量类型中是否有调用成员变量,如果有就通过编译,没有就报错
运行时:参考对象中是否有调用的函数,如果有就调用,如有没有也会调用(父类)
简单说:编译看左边,运行看右边。
C#中可以通过多种途径实现多态性:
A. 虚方法:将父类方法标记为虚方法,(使用关键字virtual),此方法在子类中可以重写(使用关键字 override)
B.抽象类与抽象方法:如果我们不需要使用父类创建对象,他的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类方法写成抽象方法,子类中的方法仍用关键字override 重写。
C. 接口实现:
我们选择使用虚方法实现多态还是抽象写抽象方法实现多态,取决于我们是否使用基类实例化的对象
抽象类:不需要使用基类实例化的对象(利用抽象来实现,类抽象化,方法抽象化,并且方法中不能有方法体{})
虚方法:需要使用基类实例化的对象
namespace 多态
{
//定义抽象类
abstract class Vertebrata
{
//定义抽象函数:绘图
public abstract void DrawSelf();
}
class Zhu : Vertebrata
{
public override void DrawSelf()
{
Console.WriteLine(@"
╭︿︿︿╮
{/ o o /}
( (oo) )
︶︶︶");
}
}
class QingWa : Vertebrata
{
public override void DrawSelf()
{
Console.WriteLine(@"
@..@
(\--/)
(.>__<.)
^^^^^^^^");
}
}
class Program
{
static void Main(string[] args)
{
//声明一个基类Vertebrata类型的数组
Vertebrata[] animals = new Vertebrata[2];
//定义派生类,并存储到数组
animals[0] = new Zhu();
animals[1] = new QingWa();
//使用统一的方法进行调用
foreach (Vertebrata someone in animals)
{
//无论是什么动物,都使用相同的语句处理
someone.DrawSelf();
}
}
}
}
is运算符
is运算符通常用于判断某个对象是不是某种类型。
//假设Human继承自Vertebrata
Human jean=new Human();
Vertebrata someone=jean;
if(someone is Human){
Console.WriteLine("someone is Human");
}
if(someone is Vertebrata){
Console.WriteLine("someone is Vertebrata");
}
向上转型
由低层次类型转换为高层次类型,称为向上类型转换。向上类型转换是自动进行的,比如把int类型变量赋值给long类型变量,把long类型赋值给double型变量,转换都是自动进行的。
由派生类转换为基类,也是向上转换,但基类的引用符不能引用派对生类对象特有的函数。
//假设基类Vertebrata中无work方法,在Human类中定义了work方法
Human jean =new Human();
Vertebrata someone =jean;
//这个地方是错误的.
someone.Work();
向下转型
由基类向派生类转换的过程称为向下转换,在这个过程中,需要进行强制转换,同时也可以使用关键字as.
Human jean=new Human();
Vertebrata someone=jean;
if(someone is Human){
Human people =(Human)someone; //强制转换
people.Work();
}
注意:
*只有由基类向派生类转换时,才能强制向下转换,否则程序会抛出异常,所以转换之前 我们使用is运算符进行检查。
Human jean=new Human();
Vertebrata someone=jean;
Human people =someone as Human; //as 运算符
if(people!=null){
people.Work();
}
一个常见的错误:Program has more than one entry point defined. Compile with/main to specify the type that contains the entrypoint.
项目有多个入口点的定义。编译/主要指定类型,其中包含的入口点。
相关文章
- C#实现谷歌翻译API
- C# String 前面不足位数补零的方法
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- c# 面试题 2023-2-6
- C#多线程
- C#,洗牌问题(Card Shuffle Problem)的算法与源代码
- C# - JSON操作
- C#中异步窗体的调用的几种方法
- c#滚动条创建实例,多线程
- C#中使用指针转换数据类型[C#/unsafe]
- C# Remoting 简单实现
- C#基础复习 面向对象 继承
- C#-面向对象:争议TDD(测试驱动开发)
- C#——await与async实现多线程异步编程
- 《C#零基础入门之百识百例》(五十一)面向对象概述 -- 一维多项式求值
- C# 面向对象(封装 — 属性)
- Unity 之 Lua模拟C#等一个协程执行
- C# 面向对象例题 -- 图书管理系统