[C#基础]基础知识一: 面向对象的基本知识.
激励自己有时间多看看.!!
C#基础共分为七个部分:
一: 面向对象
二: 值类型, 引用类型, 字符串操作
三: 集合文件操作
四: 正则表达式
五: XML操作
六: 委托, 事件
七: 反射
1, 面向对象:
面向对象的三大特性: 封装, 继承, 多态
2, 什么是类? 什么是对象? 类和对象的区别?
类: 类似模子, 确定对象将会拥有的特征(属性) 和行为 (方法)
对象是一个你能够看得到, 摸得着的具体实现-- 万物皆对象.
--类是模具, 创建对象的模具, 抽象的
.类是一组数据类型, 用户自定义的数据类型.
.类组成: 字段, 属性, 方法, 构造函数.
--对象是具体的, 是类的具体实例. 对象是具有属性(特征)和方法(行为)
--类中包含了数据(用字段标示)与行为(用方法(函数, 功能)标示, 方法为一块具有名称的代码)
3, 知识点总结
封装继承多态
一、封装:
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。
封装的意义:
封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。
封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。私有的数据可以用两种方式来间接的控制。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。
使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、“只读”、“只写”灵活的操作方法。
访问修饰符:
二、继承:
继承主要实现重用代码,节省开发时间。
1、C#中的继承符合下列规则:
- 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
- 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
- 构造函数和析构函数不能被继承。除此之外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
- 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
- 类可以定义虚文法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
2、new关键字
如果父类中声明了一个没有friend修饰的protected或public方法,子类中也声明了同名的方法。则用new可以隐藏父类中的方法。(不建议使用)
3、base关键字
base 关键字用于从派生类中访问基类的成员:
- 调用基类上已被其他方法重写的方法。
- 指定创建派生类实例时应调用的基类构造函数。
三、多态
1、多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
编译时的多态性:
编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性:
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。
编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。
2、实现多态:
- 接口多态性。
- 继承多态性。
- 通过抽象类实现的多态性。
3、override关键字:
重写父类中的virtual修饰的方法,实现多态。
五个访问修饰符
Private:只有类本身能存取.
Protected:类和派生类可以存取.
Internal:只有同一个项目中的类可以存取.
Protected Internal:是Protected和Internal的结合.
Public:完全存取.
- C# 方法默认访问级别 : private
- C# 类默认访问级别 : internal
- 接口成员访问修饰符默认为public,且不能显示使用访问修饰符。
类(class)
构造函数默认为public访问修饰符。
析构函数不能显示使用访问修饰符且默认为private访问修饰符。
析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。类的成员默认访问修饰符为private;
枚举(enum)
枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。
结构(struct)
结构成员默认为private修饰符。
结构成员无法声明为protected成员,因为结构不支持继承。
嵌套类型
嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。
字段和属性及索引器
1、属性
所谓属性其实就是特殊的类成员,它实现了对私有类域的受控访问。在C#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,创建学生姓名属性,控制对name字段的受控访问:
using System; public class Student
{
private string name;
/// <summary>
/// 定义学生的姓名属性
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
} class Program
{
static void Main(string[] args)
{
Student student = new Student();
student.Name = "Jeff Wong";
Console.WriteLine(student.Name);
Console.Read();
}
}
2、索引器
简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。比如,上例中,我们假设一个班级有若干个学生,构建索引器就可以很方便地调用:
using System.Collections.Generic; public class Student
{
public List<Student> listStudents = new List<Student>(); /// <summary>
/// 构建索引器
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public Student this[int i]
{
get { return listStudents[i]; }
set { listStudents[i] = value; }
} private string name;
/// <summary>
/// 属性
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
public Student(string name)
{
this.name = name;
}
public Student()
{
this.listStudents.Add(new Student("jeff wong"));
this.listStudents.Add(new Student("jeffery zhao"));
this.listStudents.Add(new Student("terry lee"));
this.listStudents.Add(new Student("dudu"));
}
} class Program
{
static void Main(string[] args)
{
Student student = new Student();
int num = student.listStudents.Count;
Console.WriteLine("All the students:");
for (int i = ; i < num; i++)
{
Console.WriteLine(student[i].Name); //通过索引器,取所有学生名
} //设置索引器的值
student[].Name = "jeff";
Console.WriteLine("After modified,all the students:");
for (int i = ; i < num; i++)
{
Console.WriteLine(student[i].Name);
} Console.Read();
}
}
上面代码中,我们看到索引器的访问器带一个参数(参数为整数),其实可以构建多个参数的索引器。还以上述代码为例,我们要根据学生学号和姓名得到学生的考试总分,修改后代码如下:
using System;
using System.Collections.Generic; public class Student
{
public List<Student> listStudents = new List<Student>(); public Student this[int i,string name]
{
get
{
foreach (Student stu in listStudents.ToArray())
{
if (stu.sid == i && stu.name == name) //按照学号和姓名取出学生
{
return stu;
}
}
return null;
}
set { listStudents[i] = value; }
} private int sid; //学号
public int Sid
{
get { return sid; }
set { sid = value; }
}
private string name;//姓名
public string Name
{
get { return name; }
set { name = value; }
}
private int score; //总分
public int Score
{
get { return score; }
set { score = value; }
}
public Student(int sid, string name, int score)
{
this.sid = sid;
this.name = name;
this.score = score;
}
public Student()
{
this.listStudents.Add(new Student(, "jeff wong", ));
this.listStudents.Add(new Student(,"jeffery zhao",));
this.listStudents.Add(new Student(,"terry lee",));
this.listStudents.Add(new Student(,"dudu",));
}
} class Program
{
static void Main(string[] args)
{
Student student = new Student();
Student stu = student[, "jeff wong"];
Console.WriteLine("student number:" + stu.Sid + ",name:" + stu.Name + ",score:" + stu.Score); Console.Read();
}
}
3、总结:
<1>、
属性的定义:
访问修饰符 返回类型 属性名
{
get{语句集合}
set{语句集合}
}
索引器的定义:
访问修饰符 返回类型 this[参数类型 参数...]
{
get{语句集合}
set{语句集合}
}
<2>、
索引器使得对象可按照与数组相似的方法进行索引。
this 关键字用于定义索引器。
get 访问器返回值。set 访问器分配值。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引,由你决定如何定义特定的查找机制。
索引器可被重载。
<3>、属性和索引器的主要区别:
a、类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。
b、属性可以是static(静态的)而索引器则必须是实例成员。
<4>、索引器重载实例:
using System.Collections.Generic; public class Student
{
public List<Student> listStudents = new List<Student>(); public Student this[int i,string name]
{
get
{
foreach (Student stu in listStudents.ToArray())
{
if (stu.sid == i && stu.name == name) //按照学号和姓名取出学生
{
return stu;
}
}
return null;
}
set { listStudents[i] = value; }
} /// <summary>
/// 索引器重载
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public Student this[int i] //i从0开始
{
get { return listStudents[i]; }
set { listStudents[i] = value; }
} private int sid; //学号
public int Sid
{
get { return sid; }
set { sid = value; }
}
private string name;//姓名
public string Name
{
get { return name; }
set { name = value; }
}
private int score; //总分
public int Score
{
get { return score; }
set { score = value; }
}
public Student(int sid, string name, int score)
{
this.sid = sid;
this.name = name;
this.score = score;
}
public Student()
{
this.listStudents.Add(new Student(, "jeff wong", ));
this.listStudents.Add(new Student(,"jeffery zhao",));
this.listStudents.Add(new Student(,"terry lee",));
this.listStudents.Add(new Student(,"dudu",));
}
} class Program
{
static void Main(string[] args)
{
Student student = new Student();
Student stu = student[, "jeff wong"];
Console.WriteLine("student number:" + stu.Sid + ",name:" + stu.Name + ",score:" + stu.Score); Console.WriteLine("all the students:"); for (int i = ; i < student.listStudents.Count; i++)
{
Console.WriteLine("student number:" + student[i].Sid + ",name:" + student[i].Name + ",score:" + student[i].Score);
} Console.Read();
}
}
里氏替换
一句话总结: 子类可以替换父类的位置,而程序的功能不受影响
更多链接: http://blog.csdn.net/yisuowushinian/article/details/18976629
[C#基础]基础知识一: 面向对象的基本知识.的更多相关文章
- Javascript基础回顾 之(三) 面向对象
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学
076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学 本文知识点:Java面向对象导学 说明:因为时间紧张,本人 ...
- Java07-java语法基础(六)面向对象
Java07-java语法基础(六)面向对象 一.格式化输出 System.out.printf(“%格式字符”,输出项); 1.格式字符: d --->int.byte.short ld -- ...
- C#基础第六天-作业-利用面向对象的思想去实现名片
1.利用面向对象的思想去实现: (增加,修改,删除,查询,查询全部)需求:根据人名去(删除/查询).指定列:姓名,年龄,性别,爱好,电话. 本系列教程: C#基础总结之八面向对象知识点总结-继承与多态 ...
- python基础-基础知识(包括:函数递归等知识)
老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, ", [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有 ...
- # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结
095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)
092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
随机推荐
- springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件
整合mybatis实在前面项目的基础上进行的,前面项目具体整合请参照springboot使用之一. 一.整合mybatis 整合mybatis的时候可以从mybatis官网下载mybatis官网整合的 ...
- SQL Server简洁查询正在运行的进程SQL
通常我们可以使用 sp_who2 我们希望更加简洁的信息,下面这个查询使用系统表sys.sysprocesses,以及sys.dm_exec_sql_text做OUTER APPLY. T-SQL是这 ...
- IOS学习笔记 O2
第二章 Objective-C语言基础进阶 一.Objective-C语言写法简化 利用@property快速生成setget方法 1.首先来复习一下setget写法,这是上一节笔记写的setget方 ...
- WinForm/Silverlight多线程编程中如何更新UI控件的值
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
- E9相关技术链接
1.飞思卡尔i.MX6q安装ubuntu14.04操作系统:http://demo.netfoucs.com/bzw073/article/details/42551399 2. DS-5社区版安装: ...
- Android中,图片分辨率适配总结规则drawable drawable-mdpi drawable-hdpi drawable-nodpi drawable-ldpi
一直关于android多分辨率适配有些疑惑,从网上找到一些资料并通过测试验证,参考链接:http://blog.csdn.net/lamp_zy/article/details/7686477 现记录 ...
- [原] XAF How to Edit multiple objects in a ListViewAndDetailView
2014年好久没有更新Blog了,工作调换了,很少用XAF,但还是很关注XAF的发展和学习,对中国的中小企业数据管理软件开发真的太实用了!! 功能比较简单,但很实用,直接上图和代码! ListView ...
- 企业搜索引擎开发之连接器connector(三十)
连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法 public interface D ...
- poj 3621 二分+spfa判负环
http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...
- 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;
1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...