目标的卷入与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、运行。

相关文章