C#面向对象-多态
面向对象的三大特性(封装,继承,多态)大多少人都应该知道。前两个的话比较容易理解。本文主要说一下面向对象中的多态。
什么是多态?
不同的对象对同一操作,产生不同的执行结果。这就是多态。那么多态又包含了:重载,重写,虚方法,抽象方法。
1,重载
什么叫重载?
在同一个作用域的两个或多个方法函数名相同,参数列表不同的方法叫做重载。重载有三个特点:
1.1:方法名必须相同。
1.2:参数列表必须不同。
1.3:返回值类型可以不相同。
列如:
public void Animal()
{
Console.WriteLine("睡觉");
}
public void Animal(int time)
{
Console.WriteLine("{0}点睡觉", time);
}
2,重写
什么是重写?子类中为满足自己的需求需要来重复定义基类中的某个方法的不同实现。重写需要使用override关键词。需要重写基类中的方法必须是虚方法或抽象方法。重写的特点:
2.1:相同的方法名。
2.2:相同的参数列表。
2.3:相同的返回值。
3,虚方法
什么是虚方法?
基类中定义的允许在子类中重写的方法叫虚方法。使用virtual关键字定义。子类可以不重写虚方法。列如:
class Animal
{
public virtual void EatFood()
{
Console.WriteLine("吃东西");
}
}
虚方法可以被直接调用,如:
Animal a = new Animal();
a.EatFood();
输出的是:
吃东西
虚方法被子类重写,如:
class Bird:Animal
{
public override void EatFood()
{
Console.WriteLine("鸟吃虫子");
}
}
4,抽象方法
什么是抽象方法?
在基类中定义的并且必须在子类中重写的方法叫抽象方法。使用abstract关键字定义。注意:抽象方法只能在抽象类中定义。
虚方法与抽象方法的区别:因为抽象类无法被实例化,抽象方法无法被调用,也就是说抽象方法永远不可能被实现。
应用场景:
其实多态理解起来并不是很困难。主要是怎么灵活运用到实际开发中。那么现在我举个例子:一个大型工厂,目前可以生产苹果,华为,oppo手机,每个手机所使用的芯片都是一样的,屏幕主板不一样,华为手机有红外线。你会怎么实现呢?
public abstract class Phone
{
//手机芯片
public string Chip { get; set; } = "chip"; //手机屏幕
public string Screen { get; set; } //主板
public string Mainboard { get; set; } //生产手机方法
public abstract string Production();
} //苹果手机
public class Iphone: Phone
{
public override string Production()
{
Console.WriteLine("开始生产苹果手机");
return Chip + Screen + Mainboard;
}
} //OPPO
public class OppOphone: Phone
{
public override string Production()
{
Console.WriteLine("开始生产OPPO手机");
return Chip + Screen + Mainboard;
}
} //华为
public class HuaweiPhone: Phone
{
//华为手机有红外线
public string InfraredRay { get; set; } public override string Production()
{
Console.WriteLine("开始生产华为手机");
return Chip + Screen + Mainboard + InfraredRay;
}
}
那么现在要生产苹果和华为手机:
static void Main(string[] args)
{
//生产苹果手机
Iphone iphone = new Iphone() { Screen = "苹果屏幕", Mainboard = "苹果主板" };
Console.WriteLine(iphone.Production()); //生产华为手机
HuaweiPhone huawei = new HuaweiPhone() { Screen = "华为屏幕", Mainboard = "华为主板", InfraredRay = "红外线" };
Console.WriteLine(huawei.Production());
Console.ReadKey();
}
执行输出结果:
开始生产苹果手机
chip苹果屏幕苹果主板
开始生产华为手机
chip华为屏幕华为主板红外线
我们可以看到 iphone 对象和 huawei 对象都执行了同一个方法 Production 产生了不同的结果。还记得多态的定义吗?不同的对象对同一操作产生不同的执行结果。没错,这就是多态。多态的作用:把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
本篇文章就结束啦,如有错误的地方还望大神指点。
原文来自:C#面向对象-多态-曾亚平个人原创博客
C#面向对象-多态的更多相关文章
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...
- 李洪强iOS开发之OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- 【基础】Equal方法、面向对象-多态-继承-封装
package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...
- Python之面向对象多态
Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...
- Java面向对象多态
Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...
- JAVA面向对象-多态的理解
面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...
- OC面向对象多态笔记
面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: int main() { //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 Anima ...
- linkin大话面向对象--多态
java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...
随机推荐
- 2019-2020-9 20199317 《Linux内核原理与分析》第九周作业
第8章 进程的切换和系统的一般执行过程 1 进程调度的时机 1.1 硬终端与软中断 进程调度的时机都与中断相关,中断有很多种,都是程序执行过程中的强制性转移,转移到操作系统内核相应的处理程序.中 ...
- 有趣的css3实战案例剖析—(背景动态渐变)
对于css3的学习,更多的是在于对新特性和基础理论的熟悉,这篇文章通过一个案例带领大家了解css3里一些理论知识,也将一些技巧加以总结,从而提高大家的开发效率: 本次案例为(背景颜色渐变),运用css ...
- java前端与后端怎么选??
想做这个行业,就应该了解职能以及技能需求,这样学习才能更高效.我知道一些刚刚入行的小伙伴不清楚前端.后端.到底指的是什么?两者直接的区别 前端开发 前端开发主要涉及网站和App,用户能够从浏览器上或A ...
- 区块链学习笔记:D02 区块链的技术发展历史和趋势
对于区块链的技术发展历史,其实在我的印象中也就对比特币有所了解,也听过什么火币之类的玩意,但是具体是什么.怎么运作的就不清楚了... 这次的内容首先是讲解了区块链的技术演进,一张图一目了然,虽然里面涉 ...
- png兼容IE6的方法
1.通过CSS滤镜使背景图的PNG对IE6进行兼容 定义一个样式,给某个div应用这个样式后,div的透明png背景图片自动透明了. <style> body{background: li ...
- 洛谷 P3420 [POI2005]SKA-Piggy Banks 题解
蒟蒻的第二篇题解 嗯,直接进入正题 先告诉你们这是并查集,好吧,标签上面有,再来分析这为什么是并查集. 根据题意: 每一个存钱罐能够用相应的钥匙打开或者被砸开,Byteazar已经将钥匙放入到一些存钱 ...
- tableview封装使用
下载地址 使用方法 1. #import "ZFTableView.h" 2.在需要使用的地方添加ZFTableView 如下 ZFTableView *ta ...
- iOS面试的算法相关
转自:https://www.jianshu.com/p/c4820b159159 面试中遇到的这些算法,在平常工作中,基本不会用到. 不过现实的面试中经常喜欢问关于算法的问题 有些还要求写出代码.一 ...
- 移动开发在路上-- IOS移动开发系列 网络交互四(2)
接着上次的讲,这次我们讲 网络请求的封装 打开创建的项目,让我们一起来继续完成他, 首先我们来创建一个NSobject 的文件 圈住出来的轻一点要注意.千万不要搞错了 创建好之后,开始编写代码, 我 ...
- [TimLinux] django SELinux+httpd+mod_wsgi部署
1. 实验项目 $ django-admin startproject myweb $ cd myweb/ $ python manage.py startapp poll 1. 配置使用MySQL ...