谈谈我对C# 多态的理解
面向对象三要素:封装、继承、多态。
封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,我们就来讲讲多态的理解。
我们应该经常会看到面试题目:请谈谈对多态的理解。
其实呢,多态非常简单,就一句话:调用同一种方法产生了不同的结果。
具体实现方式有三种。
一、重载
重载很简单。
public string GetValue(string x)
{
return x;
}
public string GetValue(string x, string y)
{
return x+y;
}
//调用
string myValue=GetValue("测试");
string myValue2=GetValue("测试","方法");//调用了GetValue同一种方法,只是多了个参数,但还是算得上“同一种方法”。
二、重写父类中的虚方法
public class BaseClass
{
public virtual void GetValue() //virtual关键字,供后面的子类重写该方法
{
Console.WriteLine("这是个虚方法");
}
}
public class MyClass: BaseClass
{
public override void GetValue()
{
Console.WriteLine("MyClass重写了基类的虚方法");
}
}
public class NewClass: BaseClass
{
public override void GetValue()
{
Console.WriteLine("NewClass重写了基类的方法");
}
}
public class Program
{
static void Main()
{
BaseClass baseClass=new BaseClass();
MyClass myClass=new MyClass();
NewClass newClass=new NewClass();
//在这里你会无意间想到一句很经典的话:不同的对象调用了同一种方法产生了不同的行为
baseClass.GetValue();//这是个虚方法
myClass.GetValue();//MyClass重写了基类的虚方法
newClass.GetValue();//NewClass重写了基类的方法
}
}
关于继承,还是要谈一下is和as运算符的
我们都知道,所有的类都是默认继承System.Object这个类的,也就是说所有的类都可以转化为Object。子类可以转换为父类,毕竟子类就属于父类。
在上面这个例子,MyClass类是继承BaseClass类的,也就是说MyClass可以转为BaseClass。可能,我们会想到强制转换 baseClass=(BaseClass)myClass,这样做是可以的,但如果myClass继承的不是BaseClass则会抛出异常,这样不好。这时,应该用as与is运算符,BaseClass baseClass = myClass as BaseClass,这句话,如果运行出错的话,会将null赋值给baseClass,也就是说,在使用baseClass这个对象之前,我们只需判断是否为空就行了。
MyClass myClass = new MyClass();
BaseClass baseClass = myClass as BaseClass;//即使转换的不会,只会将null赋值给baseClass,不会抛出异常。
if (baseClass != null)//只需判断一下是否为空即可
{
baseClass.GetValue();
}
if(myClass is baseClass)
{
Console.WriteLine("myClass是属于baseClass的");
}
三、实现抽象类中的方法,也是使用的override关键字
老生常谈,抽象类是不可以实例化的,抽象类的目的就是为了让其他类继承,而且只能继承一个类,如果想要实现多重继承,便诞生了接口。
public abstract class BaseClass
{
public abstract void GetValue();//抽象方法,不能有方法实体
public void GetValue2()
{
Console.WriteLine("实体方法");//抽象类可以有实体方法,抽象类是不可以实例化的,但他的子类的实例可以调用这个方法
}
}
public class MyClass: BaseClass
{
public override void GetValue()
{
Console.WriteLine("MyClass重写了基类的虚方法");
}
}
public Class NewClass: BaseClass
{
public override void GetValue()
{
Console.WriteLine("NewClass重写了基类的方法");
}
}
public class Program
{
static void Main()
{
MyClass myClass=new MyClass();
NewClass newClass=new NewClass();
myClass.GetValue();
myClass.GetValue2();//子类的实例可以调用这个方法
newClass.GetValue();
}
}
总结
注意点:
1、好好体会多态的实现,渐渐地会发现面向对象程序设计的魅力。
2、抽象类的目的就是为了继承,想要实现多重继承,就需要接口了。
3、抽象类不可以实例化,它是可以有实体方法的,继承这个抽象类的实例可以调用抽象类里面的实体方法。
4、会熟练使用is和as运算符,不要一味地使用强制转换
谈谈我对C# 多态的理解的更多相关文章
- 谈谈你对 Java 平台的理解
声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...
- java面试题(杨晓峰)---第一讲谈谈你对java平台的理解
本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ...
- python中对多态的理解
目录 python中对多态的理解 一.多态 二.多态性 三.鸭子类型 python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多 ...
- 谈谈你对java平台的理解?
问题:谈谈你对java平台的理解?java是解释执行,这句话对吗? 典型回答:java本身是一种面向对象的语言,具有很好的跨平台的能力,能够做到“write once ,run anywhere”.另 ...
- Java中的继承、封装、多态的理解
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...
- Java核心-01 谈谈你对Java平台的理解
今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 典型回答 Java本身是一种面向对象的语言,最显著的特性有两个.一是所谓的“书写一次,到处运行”,能够非 ...
- 对C#继承、多态的理解
11月3日 阴天 前两天看某位大牛写的程序,对于C#多态有困惑,今天一大早来查阅了不少资料,自认为有了一个基本的认知,记录下来,一扫今天这阴霾的天气 ------------------------- ...
- java多态的理解
面向对象语言中的类有三个特征,封装.继承.多态.封装与继承很好理解,那什么是多态呢? 1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同 ...
- 关于java中多态的理解
java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...
随机推荐
- python2.7入门 01
进入python官网 http://www.python.org/download/ 下载python2.7.x 版 下载安装后配置环境变量 在path中——>>>把安装路 ...
- win服务器管理软件巧利用——如何让服务器管理事半功倍
那些服务器管理大牛估计看到这个标题会笑了,服务器怎么管理,靠自带的远程桌面肯定是远远不够的,要实现上千台服务器同时登陆,没有一个好程序管理,估计得三餐不食为其颠倒. 那么,有什么好的服务器推荐呢?站长 ...
- jQuery-stop方法
1.stop()方法解析 停止所有在指定元素上正在运行的动画 stop(clearQueue,gotoEnd) 这个两个参数可选值是布尔值 stop(flase,flase):不请空动画队列,不立即跳 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...
- Java实现 蓝桥杯 算法训练 Remember the A La Mode(暴力)
试题 算法训练 Remember the A La Mode 问题描述 Hugh Samston经营着一个为今年的ICPC世界总决赛的参与者提供甜点的餐饮服务.他将会提供上面有冰激凌的饼片.为了满足不 ...
- Java实现 LeetCode 405 数字转换为十六进制数
405. 数字转换为十六进制数 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能 ...
- Java实现蓝桥杯模拟正整数序列的数量
问题描述 小明想知道,满足以下条件的正整数序列的数量: 1. 第一项为 n: 2. 第二项不超过 n: 3. 从第三项开始,每一项小于前两项的差的绝对值. 请计算,对于给定的 n,有多少种满足条件的序 ...
- Java实现 洛谷 Car的旅行路线
输入输出样例 输入样例#1: 1 3 10 1 3 1 1 1 3 3 1 30 2 5 7 4 5 2 1 8 6 8 8 11 6 3 输出样例#1: 47.5 import java.util. ...
- Java实现 LeetCode 230 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...
- Java实现 LeetCode 218 天际线问题
218. 天际线问题 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓.现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线 ...