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++ class CBase { public: int Add(){}; }; class CDerived: public CBase { public: int Add(){}; };

 

    C#的也大同小异,如下所示:
//C# class CBase { public void Add() { } }; class CDerived: CBase { public void Add(){} };

 

    在语法上并无不同,唯一的区别只在于编译器。C++会没有任何警告通过,而C#则是会发出警告。C#对于警告不会置之不理,它用来提醒程序员,是不是有些东西忘记了?如果想消除这个警告,应该函数前增加new关键字,如下所示:
  class CBase   {    public void Add() { }   };      class CDerived: CBase   {    new public void Add(){} //增加new关键字,消除编译器警告   };
  
    简单点来说呢,只要基类和派生类的函数名相同,但没有额外的修饰符,那么编译器就会提醒你,让你查看一下,是不是留下了什么隐患。当然,消除这个警告,还可以采用重载的方式,两者的区别在于:重载的话,通过基类访问的是派生类的函数;而隐藏的话,访问的还是基类的。所谓的隐藏,只是针对派生类而言。

 


2. 部分类定义

 

    如果想将一个类的不同功能分块,那么这两种语言又会有何种差异呢?
  
    对于C++来说,无非就是在h文件中声明,在cpp中实现。如果还要细分,那完全可以多个不同功能的cpp文件包含同一个h文件。因此,功能模块的细分相对于C++,只不过是文件的结构布局不同而已。
  
    但情形之于C#,那么情况就大为不同。因为C#没有什么头文件之说,所有的都是*.cs后缀的文件。那么,C#该如何做到功能的分离呢?在这方面,C#上升到了语言的层次,产生了partial关键字。简单来说,partial就是使用部分类定义,是类的定义放在多个文件中。例如,可以将字段啊,属性之类放到一个文件,而把方法放到另一个文件。而这一切所需要做的是,在每个包含部分类定义的文件中使用partial即可,如下所示:
public partial class MyClass { ... } 
   
    有点需要注意的是,应用于部分类的接口也会作用于整个类。换句话说,如果我们的部分类是这样定义的:
public partial class MyClass:IMyInterface1 { ... } public partial class MyClass:IMyInterface2 { ... } 
   
    它其实和如下的完整定义是等价的:
public partial class MyClass:IMyInterface1,IMyInterface2 { ... }  

   
     另外还有一点,partial关键字也可以用在定义函数方法。但这对函数有明确的限制,就是函数不能有返回值,而并且参数不能为out形参。并且,用partial修饰过的函数,还不能和virtual、abstract、override、new、sealed和extern一同使用。
  
    除此以外,partial修饰函数的时候,还有一个非常重要的特性。编译代码时,如果代码中调用了使用partial修饰的函数,编译器会检查该函数是否真正有实现代码。如果没有找到实现代码,那么编译器会删除这个被partial修饰的函数的所有调用。
  
    C#用partial修饰函数的方式,感觉上和C++宏的一种用法有点像。很多程序员为了测试的需要,会在代码中添加某些宏的调用;当程序稳定了,不再需要这种耗费性能的宏的时候,就会将宏定义为空。所不同的是,宏是需要程序员手工定义为空,而partial则是编译器自动完成。当然,这也仅仅是其中一个用法思路上的相似而已,partial和宏其实并不是一样的东西。

你可能感兴趣的:(C++,c,C#,Class,语言,编译器)