c# 面相对象2-之封装性
2015-08-25 19:58
603 查看
[b]一、封装特性:[/b]
这是一种隐藏的特性。可以用一个公式来展示类的封装特性:
封装的类=数据 + 对此数据进行的操作(即算法)
通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西。
在面向对象理论中,封装这个概念拥有更为宽广的含义。小到一个简单的数据结构,大到一个完成的软件子系统,静态的如某个软件系统要收集数据信息项,动态的如某个工作处理的流程,都可以封装到一个类中。
具备这种封装的意识,是掌握面向对象分析与设计技巧的关键
二、类的成员:
成员变量:在类里面定义的变量
成员属性:在类里面定义的属性
成员函数:在类里面定义的函数
成员属性:定义变量,右键重构,封装字段,set赋值,get取值
类成员声明主要包括:常量(const)、字段(变量)、方法、属性、事件、索引器、运算符、构造函数、析构函数等。
类的数据成员包含字段、常量和事件。
1、字段:字段是与类相关的变量,相当于C++中的变量。
eg
2、常量:用来定义与类相关的常量值。
3、事件:是类的成员,它可以让对象通知调用者某些特定的行为发生时间。
类的函数成员包括方法、属性、运算符、索引器、构造函数和析构函数。
4、方法:完成类中各种计算或功能的操作,类似函数。
a、方法的定义
【格式】:
方法修饰符 数据类型说明符 方法名([形式参数说明列表])
{
变量、数组的定义语句;
其他可执行部分
}
b、静态方法和非静态方法
C#中类定义可以包含两种方法:静态和非静态。定义静态时用static修饰,定义一个静态方法时,不能用virtual、abstract或override修饰符。
使用时需注意如下两点:
1)静态方法属于类所有,非静态方法属于类定义的对象所有 ,又称实例方法。
2)非静态方法可以访问类中包括静态成员在内的所有成员,而静态方法只能访问类中的静态成员。
eg
public void Eat()//成员函数(方法)
{
Console.Write("吃饭了!");
}
5、属性:定义类的特征,并对他们提供读、写操作。
eg
public double Weight//成员属性,定义上面的weight变量的
{
get { return weight; } //只读属性
set { weight = value; } //只写属性
}
6、构造函数在类被实例化时首先执行的函数,主要完成对象初始化操作。
作用:主要用来为对象分配存储空间,完成初始化操作(给类的成员变量赋值等)。
定义类的构造函数有如下规则:
1)构造函数的函数名和类的名称一样。
2)当某个类没有构造函数时,系统将自动为其创建构造函数,这种构造函数称为默认构造函数。
example1()
{
};
3)构造函数的访问修饰符总是public。如果是private,则表示这个类不能被实例化,这通常用于只含有静态成员的类中。
4)构造函数由于不需要显示调用,因而不用声明返回类型。
5)构造函数可以带参数也可以不带参数。
特点:
a.写法特殊:没有返回类型,函数名必须和类名一样。
b.执行时机特殊:在类实例化的时候执行,是最先执行的函数,可以用来初始化数据。
eg1
eg2
7、函数重载
条件:
a.函数名必须相同
b.函数需要的参数数量不同
c.函数需要的参数数量相同的情况下,类型不同
8、this关键字
8.static关键字
eg
9.例题
这是一种隐藏的特性。可以用一个公式来展示类的封装特性:
封装的类=数据 + 对此数据进行的操作(即算法)
通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西。
在面向对象理论中,封装这个概念拥有更为宽广的含义。小到一个简单的数据结构,大到一个完成的软件子系统,静态的如某个软件系统要收集数据信息项,动态的如某个工作处理的流程,都可以封装到一个类中。
具备这种封装的意识,是掌握面向对象分析与设计技巧的关键
二、类的成员:
成员变量:在类里面定义的变量
成员属性:在类里面定义的属性
成员函数:在类里面定义的函数
成员属性:定义变量,右键重构,封装字段,set赋值,get取值
类成员声明主要包括:常量(const)、字段(变量)、方法、属性、事件、索引器、运算符、构造函数、析构函数等。
类的数据成员包含字段、常量和事件。
1、字段:字段是与类相关的变量,相当于C++中的变量。
eg
class Goods { public double height; //实例字段 public readonly double width = 30; //只读字段在声明时赋值 public static int count = 0; //静态字段, public Goods( double h, double w ) { height = h; width = w; //只读字段在构造函数中赋值 count++; } static void Main( string[ ] args ) { Goods y = new Goods(100, 200 ); Console.WriteLine("height ={0}, width={1},count= {2}", y. height, y.width, Goods.count ); Goods z = new Goods( 300, 400 ); Console.WriteLine("height ={0}, width={1},count= {2}", z. height, z.width, Goods.count ); // z.width=700 ;则编译错误。只读字段不能在这里赋值 } }
2、常量:用来定义与类相关的常量值。
3、事件:是类的成员,它可以让对象通知调用者某些特定的行为发生时间。
类的函数成员包括方法、属性、运算符、索引器、构造函数和析构函数。
4、方法:完成类中各种计算或功能的操作,类似函数。
a、方法的定义
【格式】:
方法修饰符 数据类型说明符 方法名([形式参数说明列表])
{
变量、数组的定义语句;
其他可执行部分
}
b、静态方法和非静态方法
C#中类定义可以包含两种方法:静态和非静态。定义静态时用static修饰,定义一个静态方法时,不能用virtual、abstract或override修饰符。
使用时需注意如下两点:
1)静态方法属于类所有,非静态方法属于类定义的对象所有 ,又称实例方法。
2)非静态方法可以访问类中包括静态成员在内的所有成员,而静态方法只能访问类中的静态成员。
eg
public void Eat()//成员函数(方法)
{
Console.Write("吃饭了!");
}
5、属性:定义类的特征,并对他们提供读、写操作。
eg
public double Weight//成员属性,定义上面的weight变量的
{
get { return weight; } //只读属性
set { weight = value; } //只写属性
}
using System; class Account { private double balance = 0; //字段 public double Balance //属性 { get { return balance; } set { balance = value;} } /*============================================================= * 我们可以通过修改get、set方法达到控制存取的目的。 * 例如: * * 1)只读属性 * public double Balance //属性 * { * get { return balance; } * set { } * } * * 2)读写控制 * public double Balance * { * get * { * if(Console.ReadLine()=="1234") * return balance; * else * return -9999999; * } * set { } * } * ============================================================= */ public void Deposit(double n) { this.balance += n; } public void WithDraw(double n) { this.balance -= n; } } class Client { public static void Main() { Account a = new Account(); a.Balance = 1000; // 可以读写属性,因为属性Balance是public型的 //a.balance = 1000; //不可以读写字段,因为字段balance是private型的 a.WithDraw(500); a.Deposit(2000); Console.WriteLine(a.Balance); } }
6、构造函数在类被实例化时首先执行的函数,主要完成对象初始化操作。
作用:主要用来为对象分配存储空间,完成初始化操作(给类的成员变量赋值等)。
定义类的构造函数有如下规则:
1)构造函数的函数名和类的名称一样。
2)当某个类没有构造函数时,系统将自动为其创建构造函数,这种构造函数称为默认构造函数。
example1()
{
};
3)构造函数的访问修饰符总是public。如果是private,则表示这个类不能被实例化,这通常用于只含有静态成员的类中。
4)构造函数由于不需要显示调用,因而不用声明返回类型。
5)构造函数可以带参数也可以不带参数。
特点:
a.写法特殊:没有返回类型,函数名必须和类名一样。
b.执行时机特殊:在类实例化的时候执行,是最先执行的函数,可以用来初始化数据。
eg1
class Employee { protected string ID,Name,Salary; public Employee() { ID="0000"; Name="*****"; Salary="0"; Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary); } public Employee(string id) { ID=id; Name="空缺"; Salary="空缺"; Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary); } public Employee(string id,string name) { ID=id; Name=name; Salary="空缺"; Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary); } public Employee(string id,string name,string salary) { ID=id; Name=name; Salary=salary; Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary); } }
eg2
sing System; public class Person { public string name = ""; public int age = 0; //默认构造函数 public Person() { } //构造函数重载(1) public Person(int Age) { this.age = Age; } //构造函数重载(2) public Person(int Age, string Name) { this.age = Age; this.name = Name; } public void ShowInfo() { Console.WriteLine("The name is : " + name); Console.WriteLine("The age is:" + age); } } class Client { public static void Main() { Person p1 = new Person(); p1.ShowInfo(); Console.WriteLine("=========================="); Person p2 = new Person(30); p2.ShowInfo(); Console.WriteLine("=========================="); Person p3 = new Person(30, "Tom"); p3.ShowInfo(); } }
7、函数重载
条件:
a.函数名必须相同
b.函数需要的参数数量不同
c.函数需要的参数数量相同的情况下,类型不同
8、this关键字
partial class Ren { private int year; private int month; private int day; public Ren(int y,int m) { year = y; month = m; } public Ren(int y,int m,int d):this(y,m)//this { day = d; } public void Showbirthday() { Console.WriteLine(name+"的生日是"+year+"年"+month+"月"+day+"日"); } private string name; public string Name { get { return name; } set { name = value; } } public void Eat() { Console.WriteLine(name+"正在吃饭~"); } }
8.static关键字
eg
using System; class Example1 { static public int a;//静态成员 public int b; //实例成员 void Meth1() //实例方法 { a++; //实例方法中可以访问本类的静态成员 b++; //实例方法中可以访问本类的实例成员 } static void Meth2() { a++; //静态方法能够访问本类的静态成员 //b++; //静态方法不能访问本类的实例成员 }
9.例题
//接8中的例子中的类 public static void Main() { Example1 E1 = new Example1();//产生类的实例E1 Example1 E2 = new Example1();//产生类的实例E2 E1.Meth1(); //调用非静态方法需使用类的实例 //E1.Meth2(); //此语句出现错误,因为静态方法只能由类来调用 Console.WriteLine("a={0},b={1}",Example1.a,E1.b); //E2.a=50; //此语句出现错误,因为静态方法只能由类来调用 Example1.a = Example1.a + 50;//静态成员只能通过类来访问 E2.b = Example1.a + 60; //此语句正确,实例成员由对象来访问,静态成员由类来访问 Console.WriteLine("a={0},b={1}", Example1.a, E2.b); } }
相关文章推荐
- C#datagridview、窗体添加图标问题
- C# 、winform 添加皮肤后(IrisSkin2) label设置的颜色 无法显示
- C#一些知识点:委托和事件的区别
- c# 面相对象1-概括
- C# 删除自己new的控件是,不能直接调用控件的Dispose否则有奇怪的问题
- ICSharpCode.SharpZipLib实现压缩解压缩
- c#,调用存储过程
- C#字节数组与字符串转换
- 20150825 C# 调用带参数的存储过程 模板
- C#比较字符串忽略大小写
- C#正则表达式
- C#键盘鼠标钩子
- C#对Excel的操作
- C#学习笔记(二) -- 变量
- C#中的Dictionary简介
- C#的WebBrowser控制浏览
- C#简单的辅助工具
- C# RAS 非对称加密类 支持长字符串
- C# word开发
- C#中Datatable的Compute的用法(转载)