面向对象(Object-Oriented)的系统(II)

使用封装(Encapulation):

下面将介绍怎样将数据和方法组合在一起使用。
组合方法(method)和数据(data):

封装的2个重要特点:
1.将所需的数据和方法放在同一个作用域;
2.注意数据和方法的可访问性。
传统的过程性编程语言,如C语言,包括很多数据和函数,每个函数可以访问一部分数据,对于小型的程序,数据和函数可以很好的工作,但是随着程序功能的增多,程序的不可用性增大。数据的变化会导致适用数据的方法无效,程序越复杂,更改数据的可能性越低。程序变得很难更改 ,而对于开发者来说,更改时必然的和经常的。
所以,数据同函数分隔开就显得极为重要,另一个需要数据同函数分隔的原因就是,开发者经常使用模型来描述自己的思想,而不是计算机的思想。
面向对象的编程,可以方便的建立开发者的思想模型,可以使用人类的思想描述计算机的思想。
抛弃过程性编程,走向面向对象的编程,第一步,也是最重要的一步就是把数据和函数组合在一起。

控制可访问性:

左图所示,Withdraw,balance,Deposit放在了一个叫BandAccount的容器(Entity)中,用它来描述银行帐号的话,是很糟糕的,因为balance可以从外面访问,没有安全性,解决方法就是右图所示的,使用封装,将数据和函数放在一起组成一个封闭的区域,这样就存在区域内和区域外,设置不同的可访问性,区域外只能受限的访问区域内,对于敏感数据,设置为只允许内部访问,禁止外部访问,增加安全性。可以操作balance的函数,允许外部访问,对balance的更改,只能由Withdrao,Deposit来完成。允许外部使用的函数,定义为public,不允许外部访问的数据,定义为private.
C#允许自由的定义这个容器内成员的可访问性,可以声明public的数据,但是不建议这样做,数据最后只可以由容器内成员访问。
 对于数据都定义为Private的类型(type),可以称之为抽象数据类型(abstract data type,ADTs),这种类型,不可以访问数据的组成形式,只能使用可访问的方法。C#中内置的数据类型,如int,就是ADTs的,当把2个Int的数据变量相加时,你不必考虑这2个Int 数据的二进制构成,只需要知道运算符+。
当把成员的可访问性设为public,那么可以建立相同访问区域的不同视图(view)。
外部视图是内部视图的子集(subset)。把新的特性放在容器内,还是容器外,有很多讨论,将新的特性放在容器内,而且保持不可访问性,效果更好一些。

为什么要封装(Encapulation)

因为:
1.允许控制(control),可以由单独的方法操作数据。
   当你驾驶汽车时,只需要关心怎样假设,必须考虑汽车构造;当你到银行取钱时,不必考虑银行账户如何操作。通过使用封装和方法,就可以设计软件对象,让它按照你的想法工作。
2.允许改变(change),private数据更新,不影响外部访问。
  虽然卡车和轿车的构造不同,但是如果你会驾驶卡车,那么也会驾驶轿车;当银行存款发生变化,如发工资,或者新开帐号,使用方法都是相同的。
如果要选择把一个方法声明为Public或者Private,那么选择Private,因为将Private变为Public的影响小一些,而将Public改为Priate带来的影响要大得多。

Object Data:


对象(object)中的大多数数据(data),描述的是每个对象中的信息。如果不同的银行帐号,都有Balance的,而Balance一般是不同的。
对象中的私有数据,只可以被对象内的方法所访问。封装和隔离是指对象的有效的自我包含。

使用静态数据:

每个银行帐号都有利率,如果每个帐号都存储利率,显然不是一个好主意。
因为:
1.正常情况下,每个帐号的利率都是相同的;
2.占用了太多的硬盘空间;
3.如果利率更新,显然时间麻烦的事;
4.增加了类的尺寸。类中的私有数据,需要有一个公共的方法来访问。
解决办法,就是不要在对象级别声明利率,而要在类级别声明,这样就变为公共数据。
注意:对于定义的公共数据,不存在于类里,也不能被封装。所以包括C# 语言在内的面向对象的语言,都不允许使用公共数据,除非声明为static.
静态数据在类里被声明(静态的,compile-time entity),受益于类的封装,但是逻辑上只同类本身有关,而与类实例无关。换句话说,静态数据虽然在类中按照语法声明,但是却在实例化类之前就存在

使用静态方法(static method):

可以使用静态方法来封装静态数据(static data)。如上图所示,利率同账户类有关,同单独的类事例无关。静态方法可以在类级别使用和修改利率。
声明静态方法同生命静态数据相似,都是使用static修饰符,静态方法也是存在于类级别,只通类有关。可以使用Public和Private来控制静态方法和静态数据的可访问性。
因为静态方法只同类有关,所以只能在类级别使用静态方法,这意味着静态方法不能使用this关键字,因为this隐式的指向了调用这个方法的对象,不是类。类中,静态方法可以访问的成员包括静态数据和其他静态方法。
静态方法保留了可以访问类中所有Private成员的方法,即通过对象(object)的引用来访问其他非静态的成员。
如:

class Time
{

public static void Reset(Time t)
{
t.hours 
= 0// Okay
t.minutes = 0// Okay
hour = 0// compile-time error
minute = 0 // compile-time error
}

private int hour, minute;
}


原文更精彩。
参考:MSDN Training
            Introduction to C# Programming
            for the Microsoft® .NET Platform
            (Prerelease)
            Workbook
            Course Number: 2124A

posted on 2005-06-13 17:15  Pierce  阅读(736)  评论(0)    收藏  举报

导航