`
dato0123
  • 浏览: 913635 次
文章分类
社区版块
存档分类
最新评论

C++ VS C#(13):隐藏基类方法,部分类定义

 
阅读更多

//=====================================================================
//TITLE:
// C++ VS C#(13):隐藏基类方法,部分类定义
//AUTHOR:
// norains
//DATE:
// Monday 04-April-2011
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================

1. 隐藏基类的方法

对于隐藏基类的方法,无论是C++还是C#,都有相同的一面,就是派生类要隐藏的方法名和基类一致即可,如下C++代码所示:

C#的也大同小异,如下所示:

在语法上并无不同,唯一的区别只在于编译器。C++会没有任何警告通过,而C#则是会发出警告。C#对于警告不会置之不理,它用来提醒程序员,是不是有些东西忘记了?如果想消除这个警告,应该函数前增加new关键字,如下所示:

  
简单点来说呢,只要基类和派生类的函数名相同,但没有额外的修饰符,那么编译器就会提醒你,让你查看一下,是不是留下了什么隐患。当然,消除这个警告,还可以采用重载的方式,两者的区别在于:重载的话,通过基类访问的是派生类的函数;而隐藏的话,访问的还是基类的。所谓的隐藏,只是针对派生类而言。


2. 部分类定义

如果想将一个类的不同功能分块,那么这两种语言又会有何种差异呢?

对于C++来说,无非就是在h文件中声明,在cpp中实现。如果还要细分,那完全可以多个不同功能的cpp文件包含同一个h文件。因此,功能模块的细分相对于C++,只不过是文件的结构布局不同而已。

但情形之于C#,那么情况就大为不同。因为C#没有什么头文件之说,所有的都是*.cs后缀的文件。那么,C#该如何做到功能的分离呢?在这方面,C#上升到了语言的层次,产生了partial关键字。简单来说,partial就是使用部分类定义,是类的定义放在多个文件中。例如,可以将字段啊,属性之类放到一个文件,而把方法放到另一个文件。而这一切所需要做的是,在每个包含部分类定义的文件中使用partial即可,如下所示:


有点需要注意的是,应用于部分类的接口也会作用于整个类。换句话说,如果我们的部分类是这样定义的:


它其实和如下的完整定义是等价的:


另外还有一点,partial关键字也可以用在定义函数方法。但这对函数有明确的限制,就是函数不能有返回值,而并且参数不能为out形参。并且,用partial修饰过的函数,还不能和virtual、abstract、override、new、sealed和extern一同使用。

除此以外,partial修饰函数的时候,还有一个非常重要的特性。编译代码时,如果代码中调用了使用partial修饰的函数,编译器会检查该函数是否真正有实现代码。如果没有找到实现代码,那么编译器会删除这个被partial修饰的函数的所有调用。

C#用partial修饰函数的方式,感觉上和C++宏的一种用法有点像。很多程序员为了测试的需要,会在代码中添加某些宏的调用;当程序稳定了,不再需要这种耗费性能的宏的时候,就会将宏定义为空。所不同的是,宏是需要程序员手工定义为空,而partial则是编译器自动完成。当然,这也仅仅是其中一个用法思路上的相似而已,partial和宏其实并不是一样的东西。

分享到:
评论

相关推荐

    在一小时内学会 C#(txt版本)

    对 C++ 来说,前面例子中 Date 类的属性就是 day、month 和 year,而你添加了 Get 和 Set 方法。C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using ...

    面向对象c#试题参考

    b)C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。 c)在C#中可使用 new 修饰符显式隐藏从基类继承的成员。 d)在C#中要在派生类中重新定义基类的虚...

    Effective C++ 中文版

    条款13:以对象管理资源 条款14:在资源管理类中小心Coping行为 条款15:在资源管理类中提供对原始资源的访问 条款16:成对使用new和delete对象置入智能指针 条款17:以独立语句将newed对象置入智能指针 4.设计...

    C#继承多态 某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)

    某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)。开发部经理(DeveloperManger),既是经理也是技术人员。...特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。

    c#学习笔记.txt

    readonly声明一个字段,该字段只能赋值为该声明的一部分或者在同一类的构造函数中。 sealed指定类不能被继承。 static声明属于类型本身而不是属于特定对象的成员。 unsafe声明不安全的上下文。 virtual在派生类中...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    第13章 创建接口和定义抽象类 227 13.1 理解接口 227 13.1.1 定义接口 228 13.1.2 实现接口 228 13.1.3 通过接口来引用一个类 230 13.1.4 使用多个接口 230 13.1.5 显式实现接口 230 13.1.6 接口的限制 232 ...

    C#微软培训资料

    第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11...

    示例-用类的继承计算球圆柱圆锥的表面积体积

    用VC++6.0编写的一个用类的继承计算球圆柱圆锥的表面积体积的完整代码示例,可运行。

    在WP中调用C++代码

    在C#文件中调用C++文件实现对应用功能

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.11.3 定义引用类类型的复制构造函数 346 7.11.4 类属性 346 7.11.5 initonly字段 358 7.11.6 静态构造函数 360 7.12 小结 360 7.13 练习 360 7.14 本章主要内容 361 第8章 深入理解类 363 8.1 类析构函数 ...

Global site tag (gtag.js) - Google Analytics