当前位置:文档之家› 学习指导书

学习指导书

学习指导书
学习指导书

第一单元封装学习指导书

一:学习目标

二:重难点知识点

重难点1:封装的概念

学习方法:

1、首先要从现实世界到编程世界封装的的用处

1)所谓的封装其实就是保护对象隐私。当然,没有人能完全隐藏自己的隐私,比如现实生活中去转户口时,不得不透露自己的家庭信息和健康状况。另外,在不同的场合所透露隐私的数量也不一样,朋友和家人可能会知道你更多的隐私,同事次之,其他人则知道得更少。面向对象的编程也考虑了这些实际的情况,所以编程语言有public、private、protected、friend等关键字,以适应于不同的情况。在面向对象的编程过程中为什么需要封装(Encapsulation)呢?因为对象也有隐私,对象的隐私就是对象内部的实现细节。

要想对象保持良好的形象就要保护好对象隐私,

2)封装可以隔离变化。对象内部是非常容易变化的,比如:电脑在不断升级,机箱还是方的,但里面装的CPU和内存已是今非昔比了。变化是不可避免的,但变化所影响的范围是可以控制的,不管CPU怎么变,它不应该影响用户使用的方式。封装是隔离变化的好办法,用机箱把CPU和内存等封装起来,对外只提供一些标准的接口,如USB 接口、网线接口和显示器接口等,只要这些接口不变,不管内部怎么变化,也不会影响用户的使用方式。

3) 封装还可以提高易用性。封装后只暴露最少的信息给用户,对外接口清晰,使用更

方便,更具用户友好性。试想,如果普通用户都要知道机箱内部各种芯片和跳线是如何布局的,那是多么恐怖的事情,到现在为止编者甚至还搞不清楚硬盘的跳线设置,幸好也没有必要知道。

2、掌握封装在编程语言中的使用场合和表现形式

封装有两层含义,其一是隐藏内部行为,即隐藏内部函数,调用者只能看到对外提供的公共函数。其二是隐藏内部信息,即隐藏内部数据成员。

为了实现数据的封装,提高数据的安全性,一般建议把类的属性声明为私有的,把类的方法声明为公共的。这样,对象能够直接调用类中定义的所有方法,当对象想要修改或得到自己的属性的时候就必须要调用以定义好的专用的方法才能够实现。在考虑封装的时候,建议遵守“对象调方法,方法改属性”的要求即可。

重难点2:属性的概念

概念:属性是提供一个灵活的机制来读取、写入,或计算私有字段的值的成员。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。

实例语法:

共性问题:

a)属性与字段容易混淆

属性与字段的异同:

相同:都是表示类的一个数据(如人的身高、体重等)。

不同:属性对外部和派生类开放。这也解释了为什么需要加逻辑验证。

字段对内部开放。提供更快的性能,更少的验证,信任程序员。

b)属性的使用场合把握不准

尽可能的使用属性(property),而不是数据成员(field)。

我们的目标:尽可能编写出运行效率更高,更健壮,更容易维护的C#代码。

原则一:尽可能的使用属性(property),而不是数据成员(field)。

Always use properties instead of accessible data members.

出于以下几点原因,请在设计类时,尽可能的使用属性,而不是成员。

1、.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不被支持的内容。看看.net里的属性面板,你会明白的。

2、数据安全性检测;

属性本质上是两个函数,只是因为C#的特殊语法,但我们可以像访问成员一样的访问它。因此我们可以在属性设计上添加更多更灵活的内容,对属性进行管理。其中对属性数据的检测是其中之一。

在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决,千万不要设置默认值,这是很危险的事情。例如:

public string Name{

get{

if(this._Name==null){

return “NoName”;

}else{

return this._Name;

}

}

set{

if(value==null){

this._Name = “NoName”;

}else if(value.Length<=10){

this._Name = value;

}else{

this._Name = value.SubString(0,10);

}

}

}

看上去很不错不是吗?请马上动手修改你的代码吧,上面的代码是很危险的!或者你还不明白,明明对数据进行了安全检测,为什么还是危险的呢?试想这样的情况,有两个实例o1与o2, o1的Name为null,我们做了这样的事:https://www.doczj.com/doc/323202775.html, = https://www.doczj.com/doc/323202775.html,;

结果是什么?https://www.doczj.com/doc/323202775.html,为”NoName”,而在本质上,o1与o2的Name是根本不相等的。这会对后面的程序运行带来很大的麻烦。请以抛出异常的形式来解决数据不满足条件时的问题。

辅导视频:参见视频文件夹

作业内容:参见作业文件夹

补充阅读:参见补充阅读文件夹

重难点3:this关键字

学习方法:

首先回顾下访问修饰符的含义:

1、由具体的实例体会this关键字的作用

在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等;

也可以用this来做为参数状当前实例做为参数传入方法.

下面是你这段程序的注解:

// 引入使命空间System

using System;

// 声明命名空间CallConstructor

namespace CallConstructor

{

// 声明类Car

public class Car

{

// 在Car类中:

// 声明一个非静态的整型变量petalCount,初始值为0

// 未用Static声明的变量叫做静态变量,非静态成员属于

类的实例,我们只能在调用类的构造函数对类进行实例化后才能通过所得的实例加"."来访问

int petalCount = 0;

// 声明一个非静态的字符串变量s,初始值为"null";

// 注意:s = "null"与s = null是不同的

String s = "null";

// Car类的默认构造函数

Car(int petals)

{

// Car类的默认构造函数中为petalCount 赋值为传入的参数petals的值

petalCount = petals;

// 输出petalCount

Console.WriteLine("Constructor w/int arg only,petalCount = " + petalCount);

}

// 重载Car类的构造函数

// : this(petals) 表示从当前类中调用petals变量的值来作为构造函数重载方法Car(String s, int petals)的第二个参数

Car(String s, int petals)

: this(petals)

{

// 在构造函数中为s赋值

// 非静态成员可以在构造函数或非静态方法中使用this.来调用或访问,也可以直接打变量的名字,因此这一句等效于s = s,但是这时你会发类的变量s与传入的参数s同名,这里会造成二定义,所以要加个this.表示等号左边的s是当前类自己的变量

this.s = s;

Console.WriteLine("String & int args");

}

// 重载构造函数,: this("hi", 47) 表示调Car(String s, int petals) 这个重载的构造函数,并直接传入变量"hi"和47

Car()

: this("hi", 47)

{

Console.WriteLine("default constructor");

}

public static void Main()

{

Car x = new Car();

Console.Read();

}

}

}

共性问题:

this引用有三种典型的使用方式。第一种方式是限定被参数掩藏的实例变量;

第二种用法是把当前对象作为参数传给另一个方法;

辅导视频:参见视频文件夹

作业内容:参见作业文件夹

补充阅读:无

重难点3:访问修饰符

学习方法:

public 关键字是类型和类型成员的访问修饰符。公共访问是允许的最高访问级别。对访问公共成员没有限制,

如下例所示:

class SampleClass

{

public int x; // No access restrictions.

}

示例:

在下面的示例中,声明了两个类:Point 和MainClass。直接从MainClass 访问Point 的公共成员x 和y。

// protected_public.cs

// Public access

using System;

class Point

{

public int x;

public int y;

}

class MainClass

{

static void Main()

{

Point p = new Point();

// Direct access to public members:

p.x = 10;

p.y = 15;

Console.WriteLine("x = {0}, y = {1}", p.x, p.y);

}

}

输出

x = 10, y = 15

private 关键字是一个成员访问修饰符。私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结构体中才是可访问的

如下例所示:

class Employee

{

private int i;

double d; // private access by default

}

同一体中的嵌套类型也可以访问那些私有成员。

在定义私有成员的类或结构外引用它会导致编译时错误。

在此示例中,Employee类包含两个私有数据成员name和salary。作为私有成员,它们只能通过成员方法来访问,因此,添加了名为GetName和Salary的公共方法,以允许对私有成员进行受控制的访问。name成员通过公共方法来访问,salary成员通过一个公共只读属性来访问。

// private_keyword.cs

using System;

class Employee

{

private string name = "FirstName, LastName";

private double salary = 100.0;

public string GetName()

{

return name;

}

public double Salary

{

get { return salary; }

}

}

class MainClass

{

static void Main()

{

Employee e = new Employee();

// The data members are inaccessible (private), so

// then can't be accessed like this:

// string n = https://www.doczj.com/doc/323202775.html,;

// double s = e.salary;

// 'name' is indirectly accessed via method:

string n = e.GetName();

// 'salary' is indirectly accessed via property

double s = e.Salary;

相关主题
文本预览
相关文档 最新文档