c#学习之--封装

封装(封闭)—让你的隐私,属于你个人
有一个保护性的外壳或膜抱起来。

1.封装意味着保证类中的一些数据是私有的。
★使用封装来控制对类的方法和字段的访问。
私有字段和方法只能从类的内部访问:
一个对象要想得到另一个对象私有字段中存储的数据,只有一个办法,就是使用返回该数据的公共字段和方法。

相关问题:
❶问:我需要通过公共方法来访问私有数据。但是如果包含私有字段的类没有提供获取这个数据的方法,而我对象确实需要使用这个数据,会怎样呢?
答:如果是这样,则无法从这个对象外部访问这个数据。写一个类时,一定要保证为其他对象提供了某个途径来得到他们需要的数据。私有字段是封装的一个很重要的部分,但是他并不是问题的全部。要便携一个封装性很好的类,意味着要为其他对象提供一个合理的、易于使用的途径来得到他们需要的数据,而不允许他们非法接获你的类本身需要的数据。
❷问:既然其他类无法访问,为什么还要保留这样一个字段呢?
答:有时一个类需要记录一些必要的信息来完成操作,但是其他对象确实不需要看到这些信息。下面举一个例子。计算机生成随机数时,会使用一些特殊的值,称为种子。你不需要知道这是如何工作的,但是要知道Random的每个实例实际上包含一个数据,其中有十个数,random使用这个数据来确保Next()总会提供一个随机数。创建random的一个实例时,不会看到这个数组。这是因为根本不需要他,倘若你能访问这个数组,就可以在其中放入一些值,这会导致生成非随机的值所以种子对你完全是封装的。
❸问:我用所有事件处理程序都有private这个关键字。为什么他们都是私有的?
答:因为c#窗体要求只能由窗体上的控件触发事件处理程序。在方法前放上private关键字是,这个方法就只能在类内部使用。ide向程序增加一个事件处理方法时,会把他声明为私有,使得其他窗体或对象无法调用这个方法。但是并没有明确的规定要求事件处理程序必须是私有的。实际上你可以自己做一个检查,双击一个按钮,然后把它的事件处理程序声明为public。现在代码应该仍能编译并运行。

2.封装的作用
封装是指让一个类对另一个类隐藏信息。这有助于避免程序中出现bug。
★易于使用:
你已经知道了类使用字段来跟踪其状态。另外,很多类使用方法来保证这些字段反映最新状态,其他类根本不会调用这些方法。一个类可能包含从未由任何其他类调用的字段、方法和属性,这种情况很常见,如果将这些成员设置为私有,需要使用这个类时,这些成员就不会在智能提示窗口显示出来。
★易于维护:
窗体直接访问了一个字段,而不是使用一个方法来设置他。如果这个字段是私有的,就完全可以避免这个bug。
★灵活:
很多情况下,你可能希望退一步,向之前的某个程序增加一些特性。如果你的类得到了很好的封装,以后你就能清楚的知道该如何使用。

3,实现类封装的几个注意:
★考虑字段可能以何种方式被滥用。
★是不是类中所有一切都是公共的?
★哪些字段需要在设置时做一些处理或计算?
★只将必要的字段和方法声明为公共。

4,封装保证数据干净
有时程序正常完成工作时字段中的值会改变。如果没有明确的告诉程序重新设置这个值,就会使用原来的值完成计算。对于这种情况,你可能希望一旦字段改变就让程序执行一些语句,如每次改变就让程序重新计算。通过使用自有字段封装数据,可以避免这个问题。我们将提供一个方法得到这个字段的值,还会提供另一个方法来设置这个字段,并完成所有必要的计算。

关于封装的案例:
一个Farmer类使用一个字段存储使用一个字段存储奶牛数量,把奶牛数乘以某个数得出来喂养这些奶牛需要多少包饲料。

class Farmer
{
private int numberOfCows;//由于奶牛的数量一直在变化,如果不同时修改 bagsOfFeed,就无法修改这个自选,如果这两个数不同步,肯定会有bug。
}
public const int feedMultiplier;//农夫为每头奶牛准备了30包饲料
public int GetNumberOfCows()
{
return numberOfCows;
}
public void SetNumberOfCows(int newNumberOfCows)
{
numberOfCows= newNumberOfCows;
int bagsOfFeed=numberOfCows*feedMultiplier;

}
5.属性使封装更容易
可以使用属性,这些方法对其他对象来说是字段。可以用属性获取或设置一个后备字段,后备字段就是由属性所设置的一个字段的名。

6,使用构造函数初始化私有字段
如果需要初始化对象,不过需要初始化的一些字段是私有字段,那么就不能使用对象初始化方法。幸运的是,任何类都能添加一个特殊的方法,称为构造函数。如果类有一个构造函数,用new语句创建类时首先就会运行这个构造函数。可以向构造函数传递参数,为需要初始化的字段定值。不过构造函数没有返回值,因为我们不会直接调用这个方法。要把它的参数传入new语句。你已经知道了,new会返回对象。所以构造函数不会返回任何结果。

案例:

public Farmer(int numberOfCows,int feedMultipler)
{
       this.feedMultiplier = feedMultiplier;
       NumberOfCows = numberOfCows;

//this总是当前的一个引用,这个this.feedMultiplier指的是字段。如果没有“this”,feedMultiplier指的是参数,所以构造函数中第一行私有字段feedMultiplier设置为等于构造函数的第二个参数。
}

相关问题:
❶问:可以有不带任何参数的构造函数吗?
答:可以。类的构造函数没有任何参数其实相当常见,实际上,你已经见过这样的一个例子:窗体的构造函数。查看一个新增加的Windows窗体,找到他的构造函数声明:

public Form1()
{
    InitializeComponent();
}

这就是窗体对象的构造函数,它没有任何参数,不过必须完成很多工作。构造方法中的
InitializeComponent()方法会初始化窗体上的所有控件,并设置这些控件的所有属性。如果在IDE的窗体设计工具中将一个新控件拖到这个窗体上,并在properities窗口中设置它的一些属性,就会看到这些改变将在InitializeComponent()方法中反映出来。InitializeComponent()方法在窗体构造函数内部调用,因此一旦创建窗体对象就会初始化所有控件。
❷问:获取或设置存取方法中为什么需要复杂的逻辑?不就是一种创建字段的方法吗?
答:因为要知道,有时每次设置一个字段时,都必须做一些计算或者完成一些动作。

❸问:方法与获取或设置存取方法方法之间有什么区别呢?
答:没有任何区别!获取和设置存取方法只是一种特殊的方法,对其他对象来说看上去就 像字段,设置该字段的时候就会调用。获取存取方法总是返回一个与字段类型相同的值,而 设置存取方法总有一个名为Value的参数,其类型与字段相同。对了,顺便说一句,可以不 说“获取和设置存取方法”,而简单的称之为“属性”。

❹问:那么属性中是不是可以有任何语句?
答:确实如此。方法中能做的,在属性中也都可以做。属性中可以调用其他方法、访问其 他字段、甚至创建对象和实例。但是只有当访问属性时才会调用,如果其中的语句与获取或设置属性无关,那就没什么意义。

❺问:既然设置存取方法总有一个名为Value的参数,为什么不像其他有Value参数的方法那样,在声明中加一个括号,其中包含“int Value”呢?
答:这是因为c#的特别设计,它要求不必输入编译器不需要的额外信息。不必明确的输入也能声明参数,如果只是要输入一个或两个参数,这可能意义不大,不过如果必须输入几百个参数,这就能大大节省时间。每个设置存取方法总有一个名为Value的参数,而且该参数的类型总是与属性类型一致,由于c#的设计,你不必再写冗长的代码,一旦输入“set{”,c#就有了所需的有关类型和参数的全部信息,所以没有必要再输入更多内容,而c#编译器也不会让你输入更多不必要写的信息。
❻问:可以只有获取方法而没有设置方法吗?或者只有设置方法,没有获取方法?
答:可以!如果有一个获取存取方法而没有设置存取方法,就创建了一个只读字段:

string name = "Dash Martin";
public string name
{
   get{return name;}
}

如果创建一个属性,它只有设置存取方法而没有获取存取方法,那么后备字段只能写不能读。
如果创建一个属性,他是有设置存取方法而没有获取存取方法,那么后备字段只能写不能读。

public string Password
{
  set
  {
     if(value==secretCode)
     {
        name="Joe";  
     }
  }
}

实现封装时,这两种技术都很有用。

❼问:我使用对象已经有一段时间了,不过还没写过构造函数。这是不是说有些类不需要构造函数?
答:不是这样的,这只是说明,如果没有定义一个构造函数,则c#会自动建立一个无参数的构造函数,如果你定义了一个构造函数,它就不再为你自动生成这样一个构造函数了,对于封装来说这是一个很有意义的工具,因为这表明你可以选择让实例化你的类的人使用你的构造函数。

▲注意:
属性(获取和设置存取方法)是一中特殊类型的方法,只有在另一个类读写一个属性才会运行。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值