23. C# -- 封装

什么是封装?

封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。

使用封装的意义?

封装的意义在于保护或者防止代码(数据)被我们无意中破坏。

封装提供了一个有效的途径来保护数据不被意外的破坏。

下面我们看一些c#例子来学习这两种方法用以封装数据。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。无论我们使用哪种的方法,我们的目标是在使用数据的同时不能使它受到任何的破坏和改变。有如下好处:

其一: 使用者只需要了解如何通过类的接口使用类,而不用关心类的内部数据结构和数据组织方法。

其二:高内聚,低耦合一直是我们所追求的,用好封装恰恰可以减少耦合

其三:只要对外接口不改变,可以任意修改内部实现,这个可以很好的应对变化

其四:类具有了简洁清晰的对外接口,降低了使用者的学习过程

实例一:用传统的读、写方法封装

让我们来看一个例子有一个类Department,为了操纵这个类中的数据(stringdepartname)我们定义了一个读方法和一个写方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    //定义类
    class Department
{
        private string departname;
        public string GetDepartname()
{
            return departname;
}
        public void SetDepartname(string a)
{
departname = a;
}
}
   //客户端实现,使用两个不同方法来写和读数据
     public class TestAnimal
{
         static void Main()
{
             Department d = new Department();
             d.SetDepartname("ELECTRONICS");
             Console.WriteLine("The departname is : " +d.GetDepartname());
             Console.ReadLine();
}
}
}

结果:

The departname is ELECTRONICS

实例二:用属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    //定义类
    class Department
{
        private string departname;
        public string Departname
{
            get { return departname; }
            set { departname = value; }
}
}
   //客户端实现,使用两个不同方法来写和读数据
     public class TestAnimal
{
         static void Main()
{
             Department d = new Department();
             d.Departname = "Communication";
             Console.WriteLine("The departname is :{0} ", d.Departname);
             Console.ReadLine();
}
}
}

通过上面的例子,我们可以看到如何通过属性来实现封装。属性具有两种操作get和set。Get用来返回属性域的值。Set通过value这个变量来给属性域赋值。属性可以设为只读的(read-only)。这只需属性只具有一个set操作。

结果:

The departname is :Communication

 

参考:

http://blog.csdn.net/acmilanvanbasten/article/details/8625097

时间: 2024-08-24 23:58:18

23. C# -- 封装的相关文章

懒加载(延迟加载)之后,在使用数据过程中容易出现的bug

在UI中,使用懒加载,也就是延迟加载来加载数据的时候,总是会面临几个问题? 如:1. >为什么先创建NSArray属性? 2. >为什么重写NSArray的get方法? 3.>为什么要判断是否为空? 4.>为什么下方代码"//1"这里不用NSString stringWithFormat: 而"//2"这里要使用? 5.>同时"//2"这里为什么使用的是%ld 来作为占位符? 这些问题不搞懂,懒加载就很难通透,  代

cookie笔记

1 1.cookie的数量.大小都有限,可以控制过期时间 2 2.cookie是document的一个属性 3 3.document.cookie="user=wang"; 4 document.cookie="pass=123"; 5 “=”号不会覆盖 而是添加内容 6 cookie默认过期时间为浏览器关闭 7 4.expires为设置时间 8 9 利用new Date()获取时间 10 getFullYear() 11 getMonth()//其中月份是从0开始

研究生课程汇总

中山大学物理科学与工程技术学院 全日制专业学位(集成电路工程)硕士研究生培养方案 一. 培养目标 集成电路工程硕士专业学位主要培养微电子技术和集成电路设计应用型.复合式高层次工程技术和工程管理人才.要求学生拥护党的基本路线和方针政策,热爱祖国,遵纪守法,具有良好的职业道德和敬业精神,具有科学严谨和求真务实的学习态度和工作作风,身心健康.掌握微电子技术和集成电路设计的基础理论.先进技术方法和手段,掌握一门外国语,具有独立从事微电子工艺技术.集成电路设计.分析和开发能力以及工程管理等能力. 研究方向

通过原生js的ajax或jquery的ajax获取服务器的时间

在实际的业务逻辑中,经常是与时间相关的,而前端能获得的时间有两个:客户端的时间,服务器的时间.客户端时间通过 javascript中的Date对象可以获取,如 Java代码   var dt = new Date(); var tm = dt.getTime(); 那么tm就是客户端的时间,另外也可以通过对应的getFullYear(),getMonth(),getDate()取到对应的年月日等...但这个时间可靠吗?好吧,那取服务器时间吧经常用到的是后台写一个php,jsp,cgi,asp..

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s

面向对象笔记

类的特性: a.封装 1.防止数据被随意修改  2.使外部程序不需要关注对象内部的构造,只需要通过对象,对外提供的接口进行直接访问即可 b.继承 1.子类通过继承父类的方式,以最小代码量的方式,实现不同角色的共同点,和不同点 2.多继承时,继承顺序的区别  其中python2 就是深度查询,python3就是广度查询 C.多态 pass 什么是类? 其实类就是一个函数的集合即 class 类: def 函数1(): pass def 函数2(): pass 对象=类() #这就是实例化的过程 对

使用递归获取所有后代元素

1 function children(ele){ 2 //定义一个空数组,用来接收子元素 3 var allEle = []; 4 //1.获取这个元素所有的子元素 5 var eles = ele.childNodes; 6 //2.再去获取子元素的子元素 7 for (var i = 0; i < eles.length; i++) { 8 //遍历获取到的所有的子元素,就能拿到每一个子元素 9 var child = eles[i]; 10 //判断是否为元素节点 11 if(child

第六周课堂总结

第1章 操作符 1.1测试文件 格式 [ 操作符 文件或目录 ] 操作符: -d:测试是否为目录,是则为真(Directory) -e:测试目录或文件是否存在,存在则为真(Exist) -f:测试是否为文件,是则为真(file) -r:测试当前用户是否有权限读取,是则为真(read) -w:测试当前用户是否有权限写入,是这为真(write) -x:测试当前用户是否可执行该文件,可执行则为真(Excute) 1.2字符串比较 格式 : [ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2

小酌重构系列[23]&mdash;&mdash;封装条件

概述 当条件判断语句较为复杂时(有多个不同的检查项),就像下面这幅图所表示的,会使得代码的可读性会大打折扣,也难以清晰地传达判断意图. 再者,当判断逻辑变更时,我们不得不去修改if语句里面的判断代码.如果判断写得有问题,则会影响方法的正确性,也会给该方法的单元测试带来一些障碍. 我们可以根据检查项是否需要参数来封装条件,如果检查项不需要参数,则可以将其提取为属性:如果需要参数,则将其提取为方法.本文要讲的重构策略"封装条件"是基于"提取方法"这个重构策略的. 示例