首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

展现C#世界之五:类的介绍

  在优秀的编程语言中,你现在会遇到一个真正的大麻烦。但是,c#会给你提出警告:

  hiding2.cs(13,14): warning CS0114: 'DerivedClass.TestMethod()' hides inherited member 'BaseClass.TestMethod

  ()'. To make the current method override that implementation, add the override keyword. Otherwise add the

  new keyword.

  (hiding2.cs(13,14):警告 CS0114:'DerivedClass.TestMethod()' 屏蔽了所继承的成员'BaseClass.TestMethod()'.要想使当前方法改写原来的实现,加上 override关键字。否则加上新的关键字。)

  具有了修饰符new,你就可以告诉编译器,不必重写派生类或改变使用到派生类的代码,你的方法就能屏蔽新加入的基类方法。清单5.8 显示如何在例子中运用new修饰符。

  清单 5.8 屏蔽基类方法

  1: class BaseClass

  2: {

  3: public void TestMethod()

  4: {

  5: Console.WriteLine("BaseClass::TestMethod");

  6: }

  7: }

  8:

  9: class DerivedClass:BaseClass

  10: {

  11: new public void TestMethod()

  12: {

  13: Console.WriteLine("DerivedClass::TestMethod");

  14: }

  15: }

  使用了附加的new修饰符,编译器就知道你重定义了基类的方法,它应该屏蔽基类方法。但是,如果你按以下方式编写:

  DerivedClass test = new DerivedClass();

  ((BaseClass)test)。TestMethod();

  基类方法的实现就被调用了。这种行为不同于改写方法,后者保证大部分派生方法获得调用。

  5.3 类属性

  有两种途径揭示类的命名属性——通过域成员或者通过属性。前者是作为具有公共访问性的成员变量而被实现的;后者并不直接回应存储位置,只是通过 存取标志(accessors)被访问。

  当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set.

  在你对该理论一知半解以前,请看一下清单5.9中的例子,属性SquareFeet被标上了get和set的存取标志。

  清单 5.9 实现属性存取标志

  1: using System;

  2:

  3: public class House

  4: {

  5: private int m_nSqFeet;

  6:

  7: public int SquareFeet

  8: {

  9: get { return m_nSqFeet; }

  10: set { m_nSqFeet = value; }

  11: }

  12: }

  13:

  14: class TestApp

  15: {

  16: public static void Main()

  17: {

  18: House myHouse = new House();

  19: myHouse.SquareFeet = 250;

  20: Console.WriteLine(myHouse.SquareFeet);

  21: }

  22: }

  House类有一个命名为SquareFeet的属性,它可以被读和写。实际的值存储在一个可以从类内部访问的变量中——如果你想当作一个域成员重写它,你所要做的就是忽略存取标志而把变量重新定义为:

  public int SquareFeet;

  对于一个如此简单的变量,这样不错。但是,如果你想要隐藏类内部存储结构的细节时,就应该采用存取标志。在这种情况下,set 存取标志给值参数中的属性传递新值。(可以改名,见第10行。)

  除了能够隐藏实现细节外,你还可自由地限定各种操作:

  get和set:允许对属性进行读写访问。

  get only:只允许读属性的值。

  set only:只允许写属性的值。

  除此之外,你可以获得实现在set标志中有效代码的机会。例如,由于种种原因(或根本没有原因),你就能够拒绝一个新值。最好是没有人告诉你它是一个动态属性——当你第一次请求它后,它会保存下来,故要尽可能地推迟资源分配。

  5.4 索引

  你想过象访问数组那样使用索引访问类吗 ?使用C#的索引功能,对它的期待便可了结。

  语法基本上象这样:

  属性 修饰符 声明 { 声明内容}

  具体的例子为

  public string this[int nIndex]

  {

  get { …… }

  set { …… }

  }

  索引返回或按给出的index设置字符串。它没有属性,但使用了public修饰符。声明部分由类型string和this 组成用于表示类的索引。

  get和set的执行规则和属性的规则相同。(你不能取消其中一个。) 只存在一个差别,那就是:你几乎可以任意定义大括弧中的参数。限制为,必须至少规定一个参数,允许ref 和out 修饰符。

  this关键字确保一个解释。索引没有用户定义的名字,this 表示默认接口的索引。如果类实现了多个接口,你可以增加更多个由InterfaceName.this说明的索引。

  为了演示一个索引的使用,我创建了一个小型的类,它能够解析一个主机名为IP地址——或一个IP地址列表(以http://www.microsoft.com为例 )。这个列表通过索引可以访问,你可以看一下清单5.10 的具体实现。

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 社区讨论
 博客论点
 Dotnet频道相关导航