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设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
随机推荐
- Codeforces Gym 100418J Lucky tickets 数位DP
Lucky ticketsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...
- Spark Core源代码分析: Spark任务运行模型
DAGScheduler 面向stage的调度层,为job生成以stage组成的DAG,提交TaskSet给TaskScheduler运行. 每个Stage内,都是独立的tasks,他们共同运行同一个 ...
- [AngularJS] ngModelController render function
ModelValue and ViewValue: $viewValue: Actual string value in the view. $modelValue: The value in the ...
- 使用导入导出进行备份和恢复OCR(10g)
Oracle推荐在对集群调整时,比方添加.删除节点之前,应对OCR进行备份,能够用export备份到指定文件.假设做了replace或者restore等操作,Oracle建议使用cluvfy comp ...
- Linux下的简单好用的计算器bc
1. 关于bc bc是随意精度计算器语言,通常在linux下当计算器用,简单好用.相当于windows下的计算器. 2. 支持的运算符 主要的数学运算: + 加法 - 减法 * 乘法 / 除法 ^ 指 ...
- Spark on Yarn遇到的问题及解决思路
原文:http://www.aboutyun.com/thread-9425-1-1.html 问题导读1.Connection Refused可能原因是什么?2.如何判断内存溢出,该如何解决?扩展: ...
- Helpers\TableBuilder
Helpers\TableBuilder Table builder helper is a class that would help you to create tables in MySQL ( ...
- ASP.NET获取URL
//获取完整url (协议名+域名+站点名+文件名+参数) string fullUrl = Request.Url.ToString(); //获取客户端请求的URL信息(不包括主机和端口) str ...
- iOS之与JS交互通信
随着苹果SDK的不断升级,越来越多的新特性增加了进来,本文主要讲述从iOS6至今,Native与JavaScript的交互方法 一.UIWebview && iframe && ...
- python(6)- json和pickle模块
这是用于序列化的两个模块: json: 用于字符串和python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps ...