c#基础学习汇总----------base和this,new和virtual
base和this是c#中的两访问关键字,目的是用于实现继承机制的访问操作,来满足对对象成员的访问,从而为多态机制提供更加灵活的处理方式。
在看《你必须知道的.Net》一书中有一个例子很好的解释了base和this的用法。也很好的诠释了继承的概念,现附上书中代码:
class Action
{
public static void ToRun(Vehicle vehicle)
{
Console.WriteLine("{0} is running",vehicle.ToString());
}
} public class Vehicle
{
private string name;
private int speed;
private string[] array = new string[]; public Vehicle()
{ } public Vehicle(string name, int speed)
{
this.name = name;
this.speed = speed;
} public virtual void ShowResult()
{
Console.WriteLine("The top speed of{0} is {1}.",name,speed);
}
public void Run()
{
Action.ToRun(this);
}
public string this[int param]
{
get { return array[param]; }
set { array[param] = value; }
}
} public class Car : Vehicle
{
public Car()
: base("Car", )
{ }
public Car(string name, int speed)
: this()
{ }
public override void ShowResult()
{
base.ShowResult();
Console.WriteLine("It's a car's result");
}
} public class Audi : Car
{
public Audi()
: base("Audi", )
{ }
public Audi(string name,int speed)
: this()
{ }
public override void ShowResult()
{
base.ShowResult();
base.Run();
Console.WriteLine("It's audi's result.");
} }
class Program
{
static void Main(string[] args)
{
Audi audi = new Audi();
audi[] = "A6";
audi[] = "A8";
Console.WriteLine(audi[]);
audi.Run();
audi.ShowResult(); Console.Read();
}
}
上边的代码,试着把子类Audi覆写的ShowResult()的override改为new,然后在客户端处理类里Vehicle ve = new Audi();ve.run();ve.ShowResult();
这样对于new隐藏继承成员和override覆写的层次顺序就会有更加清楚的概念。一方面了解了base作为和直接基类进行通信的方法以及this的基本用法,又复习了下通过基类继承来实现多态的方法。调用虚函数,进一步逐一判断是否在子类进行override覆写,若覆写就调用最后一个层次继承类的覆写方法,若没有则直接调用基类的虚方法。我想这大概也是这种多态的实现取决于运行时而非编译时的道理吧。
1.把new和Virtual总结一下:
实现派生类中隐藏方法,则基类方法必须定义为virtual,这主要是针对版本控制而言,将基类方法实现为virtual能够同时保证向前扩展和向后兼容,在派生类中通过new或override进行灵活控制;new作为修饰符,实现隐藏基类成员时,不可和override共存,但可以和virtual共存。new用于实现创建一个新成员,同时隐藏基类的同名成员;而override用于实现对基类成员的扩展。
2.base和this总结一下:
base常用于在派生类对象初始化时和基类进行通信。
base可以访问基类的公有成员和受保护成员,私有成员不可访问。
this指代类对象本身,用于访问本类的所有常量,字段,属性和方法成员,不管访问元素是任何访问级别。因为this仅仅局限于对象内部,对象外部无法看到,这就是this的基本思想。另外,静态成员不是对象的一部分,因此不能再静态方法中引用this。
在多层继承中,base可以指向父类的方法有两种:一是有覆写存在的存在的情况,base将指向直接继承的父类成员的方法;在没有覆写存在的情况下,base可以指向任何上级父类的公有或者受保护的方法。
c#基础学习汇总----------base和this,new和virtual的更多相关文章
- 转载-java基础学习汇总
共2页: 1 2 下一页 Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3 Java基础学习总结——Java对象的序列化和 ...
- c#基础学习汇总----------继承
封装,继承,多态.这是面向对象的思想,也可以说是最基本的东西.说到继承,直接的说他就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类公有的受保护访问权限的属性和方法,同时子类可以通过加入新 ...
- 零基础学习openstack【完整中级篇】及openstack资源汇总
1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...
- 零基础学习hadoop到上手工作线路指导(中级篇)
此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结. 五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为h ...
- 零基础学习hadoop到上手工作线路指导初级篇:hive及mapreduce
此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结.五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解:hadoop分为h ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- C#/.NET 基础学习
初识C# C#是微软公司发布的面向对象的.运行于.NET Framework之上的高级程序设计语言.与Java有着明显不同,借鉴Delphi的特点,与COM(组件对象模型)直接集成,是微软公司 .NE ...
- ASP.NET MVC基础学习
ASP.NET MVC基础学习 传统的MVC概念 模型:组类,描述了要处理的数据以及修改和操作数据的业务规则 视图:定义应用程序用户界面的显示方式 控制器:一组类,用来处理来自用户,整个应用程序流以及 ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- TC SRM 664 div2 A BearCheats 暴力
BearCheats Problem Statement Limak is an old brown bear. Because of his bad eyesight he sometime ...
- 暂停和恢复Activity Android
暂停和恢复Activity(Pausing and Resuming an Activity) 在正常的应用程序使用,前台activity有时会被其他可视化组件遮挡,从而 造成activity的暂停. ...
- [Angular 2] How To Debug An Angular 2 Application - Debugging via Augury or the Console
In this lesson we will learn several ways to debug an Angular 2 application, including by using Augu ...
- 项目中oracle存储过程记录——经常使用语法备忘
项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...
- iOS开发——设备篇&ios8文件路径
ios8文件路径 1,之前版本的(比如iOS7)的文件路径如下: app路径 /var/mobile/Applications/59C84B75-0900-43D6-AD6F-AB9731F064 ...
- linux epoll模型
原文:http://yjtjh.blog.51cto.com/1060831/294119 Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数.Linux ...
- ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
大家好,今天跟大家谈谈Intent的用法. Intent在安卓中主要用于打开另外一个页面,这个页面可能是一个activity也可能是一个应用,也可能是 其它…… 且看下面介绍,总结摘抄网友一些 ...
- 各种电子面单_Api接口
电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印电子面单. ...
- gulp构建工具的安装
第一步:node.js安装 在gulp安装之前,本机需要node环境.访问http://nodejs.org,然后点击大大的绿色的install按钮,下载完成后直接运行程序.npm会随着安装包一起安装 ...
- s实现指定时间自动跳转到某个页面
--js实现指定时间自动跳转到某个页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...