分类: C#基础2015-06-08
14:10 2人阅读 评论(0) 收藏 举报

1,面向对象

什么是面向对象?一个分析问题的方式(增强了程序的可扩展性)

几个名词解释

OOP:面向对象编程

OOA:面向对象分析

OOAD:面向对象分析与设计

面向对象技术的优点:能够构建与现实世界对应的问题模型,并保持他们的结构,关系和行为模式。

面向对象的三大特征:封装,继承,多态

什么是类?什么是对象?类和对象的区别?

语法:

[public] class 类名

{

字段;

属性;

方法;

}

那么,我们管创建这个类的对象过程称之为类的实例化。

使用关键字 new.



this:表示当前这个类的对象。

类是不占内存的,而对象是占内存的。



结构式面向过程的   类是面向对象

1)类是模具,创建对象的模具,是抽象的

2)类是数据类型,用户自定义的数据类型

3)类的组成:字段,属性,方法,构造函数等

4)对象是具体的,是类的具体实例,对象具有属性(特征)和方法(行为)

5)类中包含了数据(用字段表示)和行为(用方法表示)

在类中用数据表示事物的状态,用函数实现是事物的行为。

类中的成员不写访问修饰符,默认是private

dotnet中类(class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。

Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。加分的回答:Int32、Boolean等都属于结构体。

属性

属性的作用就是保护字段、对字段的赋值和取值进行限定。属性的本质就是两个方法,一个叫get()一个叫set()。

既有get()也有set()我们诚之为可读可写属性。只有get()没有set()我们称之为只读属性。没有get()只有set()我们称之为只写属性

当你输出属性的值得时候 会执行get方法     当你给属性赋值的时候 首先会执行set方法

当属性的字段为只读时,可以再构造函数中给属性赋值。

属性和public字段的区别是什么?调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?

属性可以对设值、取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的,极端的例子。Public
Age{get{return 100;}set{}}。加分的补充回答:用reflector反编译可以看出,属性内部本质上就是set_***、get_***方法

析构函数  ~Studeng() 析构函数当程序结束时才执行,帮助我们释放资源。如果GC在程序结束时来不及释放资源,可以使用析构函数。

2,类的构造函数

1)编写完类以后,这个类默认有一个无参的构造函数,

2)只要为这个类手动添加一个构造函数,会自动将原有的无参构造函数覆盖掉

3)构造函数的特点:函数名称与类名完全一致;构造函数没有返回值,哪怕void也不能写;构造函数也是可以重载的;一般情况下,构造函数的访问修饰符是public;编写类后,有一个默认的无参的构造函数

[csharp] view
plain
copy

  1. public class Student
  2. {
  3. public Student()
  4. {
  5. }
  6. public Student(string name)
  7. {
  8. }
  9. public Student(string name, int age)
  10. {
  11. }
  12. public Student(string name, int age, int height)
  13. {
  14. //通过构造函数初始化类成员。
  15. this.Name = name;
  16. this.Age = age;
  17. this.Height = height;
  18. }
  19. ////.net中的终结器Finalize();
  20. //~Student()
  21. //{
  22. //}
  23. public string Name
  24. {
  25. get;
  26. set;
  27. }
  28. public int Age
  29. {
  30. get;
  31. set;
  32. }
  33. public int Height
  34. {
  35. get;
  36. set;
  37. }
  38. /// <summary>
  39. /// 学号
  40. /// </summary>
  41. public string SNo
  42. {
  43. get;
  44. set;
  45. }
  46. }

3,变量作用域

离声明该变量最近的那对包含声明语句的大括号内部

成员变量一直属于某个类,作用域在该类内部

成员变量如果使用前不赋值,默认会有一个初始值:string ------>null      int------->0     bool-------->false

局部变量------声明该变量的块语句或方法结束的封闭括号之前的作用域内(使用之前必须赋值)

4,封装

面向对象的封装就是把事物的状态和行为封装在类中,使用类的人不需要知道类内部是怎么实现的,只要调用其中的属性和方法实现功能就行。

类和对象本身就是封装的体现, 1)属性封装了字段,2)方法的多个参数封装成了一个对象,3)将一堆代码封装到了一个方法中,4)将一些功能封装到了几个类中,5)将一些具有相同功能的代码封装到了一个程序集中(dll,exe)并对外提供统一的访问接口。

封装的特点:1)隐藏代码的实现,便于用户调用,2)让代码和实现相分离,3)在类的内部实现自由的修改

封装复杂的,变化的东西,暴漏给用户简单的稳定的。

5,继承

继承:指类与类之间的关系。

如何判断一个继承关系是否合理?子类 is a 父类

为什么要继承?继承带给我们的好处?

1)代码重用

2)LSP(里氏替换原则)(通过代码说明一下,声明父类类型变量,指向于类类型对象,以及调用方法时的一些问题),多态(程序的扩展性,灵活性),方法重写override,虚方法的处理。

子类继承父类的属性和方法,使创建类变得简单,实现了代码重用,以及多态。

继承的特性:1)单根性,不允许多继承,一个类只能继承自一个父类,2)传递性,3)类的构造函数是不能被继承的,只能在子类中去调用父类的构造函数

所有的类都直接或间接的继承自object。

继承还有一个重要特性,父类对象可以引用子类实例,

将子类对象赋值给父类对象,所得到的对象时这样一个对象:他是一个编译是父类对象,运行却是一个子类对象,具体特征如下:1)被声明为父类对象,2)拥有父类属性,3)占用子类的内存空间,4)子类方法覆盖父类方法时,此时对象调用的是子类的方法,否则,自动调用继承父类的方法

继承中this和base的区别

1)this,(1)当做类的 对象,可以调用类中的成员,this.成员,(2)调用本类的其他构造函数   :this()    (调用构造函数自己)

2)base,1.调用父类中的成员(在子类重写父类成员或者子类使用new关键字隐藏了父类成员时,调用父类成员)base点不出子类独有成员。2.调用父类中的构造函数(调用构造函数,父类)

当调用从父类中继承过来的成员的时候,如果子类没有重写则this.成员;与base.成员;没有区别。如果子类重写了父类成员,
则this.成员;调用的是子类重写以后的。base.成员;调用的依然是父类的成员。子类构造函数必须指明调用父类哪个构造函数
[csharp] view
plain
copy

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //FileStream fs = new FileStream(@"c:\aa.txt", FileMode.Create);
  6. Teacher t1 = new Teacher("杨中科", 18, "yzk@itcast.cn", 1000000);
  7. Student s1 = new Student("陈超", 19, "cz@yahoo.com", "100001");
  8. }
  9. }
  10. //构造函数不能被继承。
  11. //由于在创建子类对象的时候,一定会调用子类的构造函数,而任何一个子类构造函数默认情况下都会去调用父类的无参数的构造函数,所以当父类中没有无参数的构造函数时就出错了。
  12. //解决办法:
  13. //1>在父类中增加一个无参数的构造函数
  14. //或者
  15. //2>在子类中指定子类的构造函数调用父类中的有参数的那个构造函数。
  16. class Person
  17. {
  18. public Person()
  19. {
  20. Console.WriteLine("========================");
  21. }
  22. public Person(string name, int age, string email)
  23. {
  24. this.Name = name;
  25. this.Age = age;
  26. this.Email = email;
  27. }
  28. public string Name { get; set; }
  29. public int Age { get; set; }
  30. public string Email { get; set; }
  31. }
  32. class Teacher : Person
  33. {
  34. public Teacher(string name, int age, string email, double salary)
  35. : base(name, age, email)
  36. {
  37. //this.Name = name;
  38. //this.Age = age;
  39. //this.Email = email;
  40. this.Salary = salary;
  41. }
  42. public double Salary { get; set; }
  43. }
  44. class Student : Person
  45. {
  46. //通过:base(),手动指定子类个构造函数去调用父类的哪个构造函数。
  47. //注意执行顺序是:先调用父类的构造函数,然后再执行子类自己的构造函数。
  48. public Student(string name, int age, string email, string sno)
  49. : base(name, age, email)
  50. {
  51. //this.Name = name;
  52. //this.Age = age;
  53. //this.Email = email;
  54. this.SNo = sno;
  55. }
  56. //学号
  57. public string SNo { get; set; }
  58. }
  59. //通过:this()调用本类中的其他构造函数
  60. //:base()调用父类的构造函数
  61. //:this()调用当前类中的其他构造函数。
  62. public class MyClass
  63. {
  64. public string Name { get; set; }
  65. public int Age { get; set; }
  66. public int Height { get; set; }
  67. public string Email { get; set; }
  68. public MyClass()
  69. {
  70. }
  71. public MyClass(string name, int age)
  72. : this(name, age, 0, null)
  73. {
  74. }
  75. public MyClass(string name, string email)
  76. : this(name, 0, 0, email)
  77. {
  78. }
  79. public MyClass(string name, int age, int height, string email)
  80. {
  81. this.Name = name;
  82. this.Age = age;
  83. this.Height = height;
  84. this.Email = email;
  85. }
  86. }

方法重写:

在进行方法重写的时候,子类中要重写父类的方法,那么方法的参数,方法的返回值类型,方法的访问修饰符必须与父类一致。
[csharp] view
plain
copy

  1. internal override void T1(int n)
  2. {
  3. base.T1(n);
  4. }

new关键字 :1)、创建对象     2)、隐藏从父类那里继承过来的同名成员。隐藏的后果就是子类调用不到父类的成员。

C#基础-----面向对象的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. java基础面向对象之类与对象

    java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...

  3. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  4. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  5. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  6. 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点

    前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...

  7. 第二十五节:Java语言基础-面向对象基础

    面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...

  8. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  9. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

随机推荐

  1. 无鼠标Windows操作

    1.常用tab键,方便跳转 2.打开软件方式:  1.win+1,2,3...依序打开任务栏图标.常用软件可以放在这里: 2.创建quickStart文件夹,配置路径,将所有要用到的功能都放在这里.( ...

  2. 大型B2B网站开发手记 1

    本手记记录所有该B2B网站开发中遇到的问题和解决方法,一方面给大家一些思路,一方面提升自己,记录整个过程 1. 测试环境部署问题 部署环境是server2012 R2,部署上去发现WCF报错如下 sv ...

  3. Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...

  4. dlmalloc(Android bionic C库的malloc实现)简介

    欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=56 Dlmalloc是目前一个十分流行的内存分配器,其由Doug Lea从1987年开始 ...

  5. 实现Ogre的脚本分离 - 天龙八部的源码分析(一)

    目的 在研究天龙八部游戏的源码之时, 发现 Ogre 材质的模板部分被单独放在一个 material 文件之内, 继承模板的其他材质则位于另外的文件, 当我使用Ogre 官方源码, 加载脚本时其不会查 ...

  6. 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

    分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前 ...

  7. jmSlip WEB前端滑屏组件

    基于css3的滑屏组件 demo: http://slip.jm47.com 下载: https://github.com/jiamao/jmSlip 功能清单 区域横滚 整屏竖滚 滚动动画效果 区域 ...

  8. guzzle调用失败-缺少guzzle

    用composer安装了,但是目前为止还有问题.开发环境是 WAMP PHP5.4.12. 已经打开PHP.ini 的SSL扩展,现在还是提示缺少 curl-ca-bundle.cr 报错 No sy ...

  9. RCP:美化基于eclipse3.7.2的RCP界面

    从e4开始,eclipse rcp界面具备了深度自定义的能力. 但是在eclipse3.7.2上,几乎没有提供能够用于修改界面的外部接口. 这里介绍一种方式来自定义你自己的eclipse rcp. 先 ...

  10. dojo/request模块整体架构解析

    总体说明 做前端当然少不了ajax的使用,使用dojo的童鞋都知道dojo是基于模块化管理的前端框架,其中对ajax的处理位于dojo/request模块.一般情况下我们使用ajax请求只需要引入do ...