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个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...
随机推荐
- Good Bye 2017 A B C
Good Bye 2017 A New Year and Counting Cards 题目链接: http://codeforces.com/contest/908/problem/A 思路: 如果 ...
- Ubuntu18.04下搭建LNMP教程-超详细图文(Nginx+MySQL+PHP含各种解决报错问题)
笔者最近在VM15.0上安装了Ubuntu18.,先来安装一个LNMP(Nginx+MySQL+PHP)网站服务器架构,为后续的实验做准备~ LNMP是指一组通常一起使用来运行动态网站或者服务 ...
- mybatis中因为不理解$与#而出现的bug
最近项目中遇到一个bug,正常的流程是这样的:要上传一个应用,首先检查系统中是否已经存在这个应用的更高版本,如果存在,则上传操作将被取消. bug体现为当传入系统中存在的所有应用与新上传的应用的ver ...
- python让你再也不为文章配图与素材发愁,让高清图片占满你的硬盘! #华为云·寻找黑马程序员#
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- .Net core-邮件发送(同步,异步)底层代码(欢迎留言讨论)
using MailKit.Net.Smtp;using MimeKit;using System;using System.Collections.Generic;using System.IO;u ...
- Vue.js命名风格指南
前言 本命名风格指南推荐了一种统一的命名规范来编写 Vue.js 代码.这使得代码具有如下的特性: 统一团队的命名规范,其它开发者或是团队成员更容易上手阅读和理解. IDEs 更容易理解代码,从而提供 ...
- react-native android/ios 手动/自动 修改版本号
目录 一 手动操作 1.Android 2.IOS 二 自动从配置文件读取并写入相应的地方 1.package.json配置版本 2.Android: 3.IOS 添加sell代码 当版本迭代时候要修 ...
- 调用rest api杀死yarn上的应用
调用rest api杀死yarn上的应用 调用yarn reat api,通过app name 获取application id public static String getApplication ...
- IO 文件夹的拷贝
package FileCopy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...
- linux需要了解的网络基础知识
第1章 网络命令 1.1 用户模式下的命令 1.1.1 enable切换到特权模式 Router>enable Router# 特权模式 Router# Router# 1.2 特权模式下的命令 ...