C# 第三天
来源:互联网 发布:犀牛软件初级教程 编辑:程序博客网 时间:2024/05/16 13:48
再次回顾一下静态成员可以直接调用而不用生成类(结构)的实例
静态构造函数:
编译器允许为一个不确定值的静态变量(需要外部输入或者数据库交互等)使用静态构造函数为其动态赋值。
一个类只可以有一个静态构造函数,也就是静态构造函数不能重载!
静态构造函数不允许有访问修饰符(查看CIL可以知道是private),不能接受任何参数!
静态构造函数在类加载的时候就运行,保证所有静态变量能够赋值,如果到时候仍然没有赋值,异常报错!
静态类:
静态类一般称作为工具类,不能用new创建,并且字段和成员必须都是static关键字。
OOP的支柱:封装、继承、多态
封装的作用:安全
继承的作用:代码重用
里氏替换原则:任何基类可以出现的地方,子类一定可以出现(is-a关系)。
如果可以使用组合,就不要使用继承
OOP中提供另一种代码重用:包含/委托(也就是has-a关系,或称聚合),其实就是字段就是一个类
多态的作用:多态
虚拟成员(virtual)定义默认实现的基类成员,可能被派生类改变(重写)
抽象成员(abstract)不提供默认实现的成员,但是提供签名,
封装:
为了便于记忆和查询,给出下面的图:
为了访问私有字段,除了使用传统的set、get,还提供了属性来实现:
class Car { private string name; public string Name { get { return name; } set { name = value; } } } class Program { public static void Main() { Car benz = new Car(); Console.WriteLine("car name is:" + benz.Name); benz.Name = "Benz"; Console.WriteLine("now car name is:" + benz.Name); } }
输出:
car name is:now car name is:Benz
当然,我们还可以在set中添加各种各样的限制条件,保证数据的可靠性。这样为了代码的简洁性,我们可以把构造函数中的合法性也交到属性中。让属性完全的作为数据的R/W+valid。
自动属性:
public string Name{get;set;}
但是
由于私有的返回字段是在编译时创建的,所以不能使用字段初始化语法,而是用new关键字直接分配引用类型。这项工作必须在构造函数中执行,而不能是属性中的字段初始化。
class Airplane { public string Name{set;get;} public Airplane() { Name = "CTRIP"; } } class Car { //错误!plane是null,而不是Airplan的默认构造函数 public Airplane plane { set; get; } public Car() { plane = new Airplane(); //不在构造函数中new,会抛出异常 } } class Program { public static void Main() { Car car = new Car(); Console.WriteLine(car.plane.Name); } }
自动属性毕竟是为了方便,如果有大量逻辑问题还是建议使用默认的构造函数、额外函数、具体属性实现。
对象初始化:
class Car { public string plane { set; get; } } class Program { public static void Main() { Car car = new Car {plane = "CTRIP" }; Console.WriteLine(car.plane); } }
针对上一段代码中的问题,我们也可以这样初始化:
Car car = new Car {plane = new Airplane() };
分部类型:
产品级的类非常长,而字段和属性一般是不变的,所以可以分开!
多态:
成员投影:
如果派生类想要实现一个和基类一样的变量或者方法,有一下两种解决方案:
1.override
2.投影:
class Transportation { public void Run() { ... } }class Car:Transportation { public new void Run() { ... } }
基类派生类的转换:
object类,显示转换就行
显示强制转化是在运行时而不是编译时
考虑到可能是非法的转换,所以可以用关键字as检测
class Transportation { } class Car:Transportation { } class Program { public static void Main() { object obj = new Car(); Transportation car = obj as Transportation; if (car == null) Console.WriteLine("obj is not a transport!"); } }
和as类似,is关键字可以检测兼容。
为了早日看完代码,只能按照项目需求study了,而不能是顺势顺序了。
- C#学习第三天
- C#学习第三天
- C# 第三天
- C#学习第三天
- C#基础第三天
- 21天学通C# 第三天
- 第三天 C#基础小结
- C# 基础学习第三天
- C#高级编程第三天
- 索引器C# -第三天
- 学习C#记录之第三天
- C#面向对象第三天总结
- noteBook2.3-C#基础第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 开发基本路线框架
- 关于Xcode ARC与非ARC(MRC)设置
- unbuntu命令行使用socks代理
- OC之NSString和NSDate互转
- jsp获取网站域名 域名解析
- C# 第三天
- C#迭代器
- 数据结构(Java)——查找和排序(1)
- 面试时是该诚实作答还是该说谎?
- 坚持
- 显示Mac下的隐藏文件
- 15个jQuery小技巧
- LeetCode Maximum Depth of Binary Tree
- 黑马程序员-Java的设计模式