对象的卷入与C#的类

《叩开C#之门》体系之三

三、对象的包裹与C#的类

面向对象思想有多少个焦点因素:封装、继承与多态。如能正确驾驭那三要素,那么基本上可以算是在编程中建立了面向对象思想。在其次节中我曾介绍,在C#中,所有数据类型的实例都是“对象”,然而最能展现对象特质的品种,依然“类”,同时它也是C#中最关键、最频仍使用的序列。接下来,我将由此介绍C#的类,来足够知情对象封装的定义。

所谓“对象”,形象地说,大家得以把它通晓为一块积木。设计积木的人须要统筹积木的外观与形态,还有中间的材料。堆积木的人对于其中的材质并不关切,他们只须要依照不一样的外观与形状来控制堆放的地点。因而,对于开发者而言,要规划面向对象的先后,同时会是八个截然不一致不相同的身份:设计者与使用者。

先谈谈使用者。使用者的身份,就是选拔已经提需要你的有所目的,按照需求,设计出自己须要完毕的先后。就像是堆积木的进度。那刚好是面向对象编程的优势所在,那就是“对象的任用”。已经安插好的对象,可以被不一致的使用者调用,这一个职能既然已经完成,对于使用者而言,当然就免去了和谐去设计的进度。正如堆积木那样,既然有了现成设计好的积木,使用者所要做的干活就是把那些积木最终结合起来,堆成区其余形制。.Net
Framework所提供的类库,就是那般的积木。

例如大家想把一个int类型转换成字符型,就不曾要求自己去贯彻那种转移,直接调用.Net
Framework提供的作用就可以了:
int i = 10;
string s = i.ToString();

再比如大家想弹出一个Windows音讯框,同样可以直接使用.Net
Framework现有的类库:
MessageBox.Show(“Message”);

在上述的事例中,i和MessageBox都是一个对象。

再谈谈设计者的身价。固然.Net
Framework的类库功用已经格外强大,但它不容许考虑到业务的漫天,倘诺急需采用一个常有就不设有的对象,此时就需求协调来设计了。例如图书管理体系,可能就须要用户,图书等对象。那就须要开发者自己来规划那些目的。

既然最能呈现“对象”思想的门类是“类”,我就来介绍一下C#中的类类型。C#中类的重大字是class。在一个class对象中,主要分为field(字段)、property(属性)和method(方法),前面多个照应的是目的的属性,而method则对应对象的一言一动。一个金榜题名的class定义如下所示:
public class User
{
 private string m_name;
 private string m_password;
 private int m_tryCounter;
 public string Name
 {
  get {return m_name;}
  set {m_name = value;}
 }
 public string Password
 { 
  get {return m_password;}
  set {m_password = value;}
 }
 public void SignIn()
 {  
  if (m_tryCounter < 3)
  {
   if (IsValid())
   {  
    m_tryCounter = 0;
    Console.WriteLine(“User {0} was signed in.”, m_name);
   }
   else
   {
    m_tryCounter++;
    Console.WriteLine(“User {0} is invalid. Can’t Sign in.”, m_name);
   }
  }
  else
  {
   Console.WriteLine(“You try to sign in more than 3 times. You are be
denied.”);
  }
 }
 public void SignOut()
 {
  m_tryCounter = 0;
  Console.WriteLine(“User {0} was signed out.”, m_name);
 } 
 private bool IsValid()
 {
  if (m_name.ToUpper() == “ADMIN” && m_password == “admin”)
  {
   return true;
  }
  else
  {
   return false;
  }
 }
}

字符串m_name,m_password,m_tryCounter就是类User的字段,Name,Password是类User的属性,而SignIn、SignOut和IsValid则是类User的方法。

关于field,property和method,我会在将来的篇章中介绍,那里紧要介绍的是在这几个类中冒出的修饰符public、private等连锁的学识。

面前说到对象好比是一个积木,设计者要求定义好那个积木的外观和样子,也要考虑积木内部的成立,例如接纳的材料,以及是空心仍然真诚。若是将这一个积木剖开来看,实际上该对象应分为内、外两层。由于使用者只关怀外部的贯彻,由此设计者就须要考虑,哪些完毕应揭露在外,哪些已毕应隐藏于内。那就呈现了对象的卷入的想想。

包裹对象,并非是将全体对象完全包裹起来,而是依据具体的内需,设置使用者访问的权位。在C#中,分别用修饰符public,internal,protected,private设定,分别修饰类的字段、属性和办法,甚至于类对象自我:
public:注明所有目的都得以访问;
protected
internal:注解同一个程序集内的目的,或者该类对象以及其子类可以访问;
internal:评释唯有同一个程序集的目的可以访问;
protected:评释唯有该类对象及其子类对象足以访问;(关于继续,会在后来介绍)
private:注明唯有对象自我在目标内部可以访问;

可以见到,public的开放性最大,其次是protected
internal,private的开放性最小。internal和protected居中。那么,internal和protected哪一个开花范围更大啊?我以为,没有完全相对的结论。它们的范围前者浮现一个横向的定义,后者则浮现纵向的定义。如果是internal,那么外部程序集对象自然不可能访问,但倘若是地处同一个程序集中,则装有指标都足以访问它;如若是protected,那么即便是外表程序集对象,只要它连续了该目标,就足以访问,而固然是同等程序集,即使目的不是此类对象的子类,也是不可以访问的。打一个比方,在大家的观念文化中,是那一个强调“宗族”观念的,一个宗族的族长,对于本族人而言,权力极大,甚至左右了生杀大权。以一个州府的限制为例,internal就好比是太师大人,只如果该州府的国民,都属于她的总理范围,而不管她是哪一个宗族。protected则好比是宗族的族长,只若是其一宗族的分子,都要坚守他,哪怕该成员属于其余州府。我原先看过《雍正帝王朝》,其中就有这么一个内容,身为皇子的胤祯,竟然不可能挽救自己心爱女人的天数,因为那些妇女违反了他们宗族的族规,最终眼瞅着他被活活烧死,却只可以黯然泪下,梦里萦回。

此前边定义的User类而言,所有的字段m_name,m_password,m_tryCounter都是private的,因而User类的外表调用者不能调用它们,但请留心User类内部的格局比如SignIn或者性质Name,却完全可以调用。同样的,private方法IsValid,可以被SignIn方法调用,但对于外部调用者而言,则是无能为力调用的。而对此public属性Name,Password,public方法SignIn和SignOut,外部的调用者是可以访问的。在末端的演练中,大家可以见到那之间的分别。通过如此分层次的包装,就足以足够有限支持对象的重用性和安全性。

那么对于类类型而言,怎样确定它们的拜访权限呢?那要依据实际的要求来看了。假定这几个User类是用来一个电子商务网站。那么电子商务系统在设计进程中,就要求调用到User类对象。显明,登录与脱离职能是必须提需求外部使用者的,例如登录页面就会选取到User类。而IsValid()方法用于阐明用户的合法性,即使也很是必要,但该功效仅仅用于登录的时候核实用户身份,也就是说,IsValid方法只会被SignIn方法应用,但外表实用者却并不爱抚,因而,设置为private就是客观的。同样的道理,字段m_tryCounter也是这么。但一旦需求发生变动,验证用户的功效不仅仅是登录的时候须要运用,在累加货物到购物车,下订单,付款的时候,都亟需该意义,那么IsValid方法,就有须求修改为public方法了。

故而,在统筹程序的时候,除了要考虑识别对象,还要充足考虑该目标的包装。类对象内的字段、属性和格局,包蕴类本身,哪些应该暴露在外,哪些应该被隐形,都亟待依照实际的须要,给与正确的安排性。

演练:
(一)设计类User,并调用该类
1、打开Visual Studio.Net,选择“File”菜单的“new”,选择“Project”;
2、选择Visual C# Projects中的“Console
Application”。在Location中,定位你要保存的品种的不二法门,而名字则为“SecondExample”。该名字此时既是焚林而猎方案的名字,同时也是该品种的名字。
3、用鼠标右键单击项目名,在弹出的对话框中,将Assembly
Name命名为SecondExample,将Default Namespace命名为:布鲁斯Zhang.com.
SecondExample。
4、用鼠标右键单击项目名,采用“Add”菜单项的“Add Class”:
 

图片 1

5、在弹出的对话框中,将文件的名字命名为User.cs,如图:
 

图片 2

6、点击“Open”按钮后,项目中就添加了一个新的文书User.cs。打开该文件,将public
class User中的内容,修改为前边文中定义好的User类。
7、修改原有默许的Class1.cs(要是是Visual Studio
2005,则默许为Program.cs)文件名为App.cs,然后将文件内容改动为:
 class App
 {
  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   User user = new User();
   
   //用户名和密码均错误;
   user.Name = “Bruce”;
   user.Password = “test”;
   for (int i=0;i<=4;i++)
   {
    user.SignIn();
   }
   user.SignOut();

   //用户名正确,密码错误;
   user.Name = “admin”;
   user.Password = “test”;
   for (int i=0;i<=4;i++)
   {
    user.SignIn();
   }
   user.SignOut();

   //用户名和密码正确;
   user.Name = “admin”;
   user.Password = “admin”;
   for (int i=0;i<=4;i++)
   {
    user.SignIn();
   }
   user.SignOut();

   //注意此时是不能调用那样的字段和方法的;
   //user.m_name;
   //user.m_password;
   //user.IsValid();

   Console.ReadLine();
  }
 }
8、运行。

相关文章