本帖最后由 excelhomesnake 于 2016-3-3 17:59 编辑
调用类,强类型,类型转换.
本帖在开始写的时候,是考虑最后一点是介绍多态的应用.但思前想后,多态的应用与”基础”二字相差遥远,因此决定另外开一个贴是介绍多态等知识的. 作为本帖的结尾章节,也是为了下一贴的准备知识,就说一下类型方面的知识.事实上本帖到这里开始才算真正涉及到编写代码 从我到这个板块看到的问题贴,有不少童鞋是连类型都还没有搞清楚就写出来一个个功能,说是厉害,一旦遇到问题而没有在网络上找到一致的解决方法,就不能继续写下去了.
作为简单的例子,我们先创建一个Person类,其中有属性Name,Age.一个Computer类,其中有一个属性SystemName
如下:
- class Person
- {
- public string Name
- {
- get;
- set;
- }
- public int Age
- {
- get;
- set;
- }
- }
- class Computer
- {
- public string SystemName
- {
- get;
- set;
- }
- }
复制代码
如果你有看本节之前的内容,写上这些代码,应该不会超过10秒.
那么如何使用这个类? 1. 实例化为对象.New 类名字() 2. 使用一个类型匹配得上的变量保存步骤1实例化的对象的引用. 代码如下: - Person ps = new Person();
复制代码
这里补充一下一些比较深入的知识.变量到底保存了什么? 注意,变量不是直接保存对象的.
简单来说,变量保存两个信息 1. 对象的引用(可看作是对象的一个身份id) 2. 变量的类型.
变量的类型决定了你在使用变量的时候,可以有什么样的操作(就是属性或方法). 对象的引用决定了这个变量在操作哪个对象.
根据上面两点,定义变量的时候,必须要定义好这个变量的类型,然后才可以让这个变量去保存类型匹配得上的对象.例如这样子:
- Person ps;
-
- ps = new Person();
复制代码
注意:以上代码在执行了第一句后,在第二句执行之前,这个变量的类型信息已经有了,但却没有对象的引用.因此这个变量的引用是为null(vb.net是nothing).我们称之为空引用.空引用问题是这些语言的一个很严重的问题,因为它不能在编译时检测出来,只能推迟到运行时才会发现错误,但那个时候已经是程序的报错了.
当然,C#或vb.net是可以在定义的时候直接写上赋值的操作.因此也可以如下: Person ps = newPerson();
注意:这里另外说一个很有趣的东西,上面的赋值语句其实是有返回值的,上面的代码最终会返回那个变量.这一点对于你将来学一些语言的知识会有一些小帮助.
因此,如下的代码也可以成立:
- Person ps1;
- Person ps2;
-
- ps1 = ps2 = new Person();
复制代码
类型匹配到这里就有个问题了,到底怎样才算类型匹配? 简单来说为几点: 1. 变量类型与对象类型一模一样. 2. 变量类型与对象类型有关系.
“一模一样”是很好理解的.”有关系”一般是指两种: 1. 继承关系.变量的类型是父类,对象类型是子类. 2. 接口关系.变量的类型是接口类型,对象类型是实现了这个接口的类型.
这里的重点其实是,必须保证之后的代码,在调用这个变量的某个方法(或属性)的时候,指向的对象一定要存在这个方法(或属性),这样的规则保证变量的类型包含了对象的所有的特征.
因为上面说的两种关系刚好是语言规则下都是符合这样规则,所以才能成立. 看个例子:
- //不成立,因为两边类型不一致
- Person ps1 = new Computer();
-
- //成立,因为在.net中,所有的类都默认继承于object
- object obj = new Person();
复制代码
说明: 1. 第一句不成立是因为类型不一致.留意看vs的错误提示,说是类型不能转换.
2. 第二句成立是因为object是所有类型的父类,一个父类的变量可以接受一个它的子类的对象.因为,在面向对象语言规定,子类包含了父类所有的成员(方法,属性,事件之类的).因此,如果我在下面继续写代码去使用变量obj,这个时候我可以使用的方法肯定在Person类型的对象中也会有的(例如ToString()方法).
3. 这里的一个重点是,object是所有类型的父类.你会发现,刚刚定义的Person类,使用的时候会多出几个方法.那些多出来的方法就是从object那里继承过来的.初学者刚了解继承的特点,很容易就会想到这样可以复用很多代码啊.但这样想是错误的,继承的概念不是为了重用代码.因此我是建议先学接口类型,再去学继承的.
初学者可以先确保类型要一模一样.之后了解了继承和接口的知识,就自然懂得那些道理.
类型转换在C#中,类型是可以转换,分为”显示转换”和”隐式转换”. 显示转换是指这个转换本身是有可能导致运行时由于类型问题而出现的错误.因此这样的转换必须编写者在代码中明确指示才可以成立.
隐式转换是指这个转换是安全的,不会在转换后产生运行时由于类型问题而出现的错误.因此这样的转换不需要特别写出什么的指令.就如之前的内容,Person对象赋值给object变量,也是一种安全的类型转换.
这里就不详细介绍显示转换了,可以参考本板块的一些基础贴.这里说一下隐式转换中的”安全”是怎样理解.关于引用类型,在之前的内容已经有说明了,关于值类型也是类似的.例如,int可以安全转换到double.反过来就不行了.因为double转换int会丢失小数点后的数据.
一些基本的语法,建议参考以下贴: http://club.excelhome.net/thread-1259984-1-1.html
|