实例剖析C++/CLI中的继承与枚举 

2011-02-22 15:26 发布

3958 1 0
枚举器 请看例1中声明的类型,它存在于其自身的源文件中,并编译为一个只包含此类型的程序集: 例1: publicenumclassTransactionType: unsignedchar{Deposit,Withdrawal,Transfer}; 与想像的一样,枚举器中的Deposit、Withdrawal、Transfer分别代表0、1、2的常量值,但有三个方面却让这个enum类型与标准C++的enum类型(也就是"本地enum")大不相同。 enum类只用于取代enum。这使TransactionType成为了一个CLIenum。(也允许enum结构,其与enum类等价。) 此类型的可性为public,以使其可从父类程序集外可见。(在C++/CLI中,一个本地enum类型也能有一个限定符。) enum类有一个显式的基本类型限定符:在本例中为unsignedchar。(在C++/CLI中,一个本地enum也能有一个基本类型。)默认情况下,基本类型为int。基本类型也能为bool或除wchar_t之外的任意整形。(如果指定bool为基本类型,枚举器必须显式地进行初始化,因为没有默认的初始值。) 支持这个新语法的原因是CLIenum遵从CLS标准,而本地enum却不遵从。 CLIenum与本地enum间最大的区别在于构成方式上,枚举名的作用范围由它的父类enum类型来限定。另外,标准C++中定义的整数提升,并不适用于CLIenum。 与本地enum类似,一个CLIenum也能被定义在一个类中,在这种情况下,就不允许使用限定符了,因为嵌套类型的可见性,已被其嵌入到的类型可见性所取代。 交易的抽象基类 交易类型的继承体系在基类Transaction中,默认从System::Object继承,见例2: 例2: usingnamespaceSystem; usingnamespaceSystem::Threading; /*1*/ publicrefclassTransactionabstract { TransactionTypetypeOfTransaction; /*2*/DateTimedateTimeOfTransaction; public: /*3a*/propertyTransactionTypeTypeOfTransaction { TransactionTypeget(){returntypeOfTransaction;} private: voidset(TransactionTypevalue){typeOfTransaction=value;} } /*3b*/propertyDateTimeDateTimeOfTransaction { DateTimeget(){returndateTimeOfTransaction;} private: voidset(DateTimevalue){dateTimeOfTransaction=value;} } /*4*/virtualvoidPostTransaction()abstract; protected: /*5*/Transaction(TransactionTypetransType) { /*6*/Thread::Sleep((gcnewRandom)->Next(1000,2001)); /*7*/TypeOfTransaction=transType; /*8*/DateTimeOfTransaction=DateTime::Now; } }; 在标号1中,这个类被标为abstract(抽象类),这意味着它不能被直接实例化。(抽象不是一个关键字,仅仅在此上下文中作了保留。)这个abstract修饰词可用于定义一个抽象类,而无须显式地声明一个或多个成员函数为纯虚类型。 在类的私有数据成员部分,一个Transaction包含了一个交易类型及一个时间日期戳,两者都由定义在标号3a及3b中的属性来。在标号2中使用的CLI库值类型System::DateTime允许用一个即时变量显示出当天的日期与时间。请注意,两个属性是怎样拥有公有get方法与私有set方法的。(这是基于新的CLI标准,并且现在已与CLS兼容了。) 标号4要求每个具体的交易类型都有公共的成员函数PostTransaction,在此的abstract函数修饰符等同于标准C++语法中的纯虚函数,一个抽象(abstract)函数必须显式地声明为virtual。 由于构造函数只应从继承类中调用,所以定义在标号5中的构造函数为protected,但它需做的事情却非常简单:设置新的交易类型为传递进来的类型,并通过调用公有属性DateTime::Now的get方法把时间日期戳设置为当前时间。有关传递进来的交易类型,应为一个值类型,而不允许为nullptr,由于CLIenum的强类型检查,编译器只允许同类型的枚举器被传递,或者同类型的实例,当然了,其也只能被同类型的枚举器所初始化。 通常地,构造函数必须尽快执行完,在此,为从测试程序中得出的结果,所以在程序中安置了一个延迟方法,因此时间日期戳在每次交易时都会改变,见标号6,构造函数会在初始化数据成员之前,随机休眠一段时间。由于每个程序至少都会有一个执行线程,而此线程的有关特征可通过sealedSystem::Threading::Thread引用类来设置或获取,Thread::Sleep函数则把当前执行线程挂起指定的毫秒数。 为使挂起的时间有所变化,使用了System::Random引用类来生成一系列的伪随机数,标号6中重载的Next函数则获取了一个"大于等于1000,小于2001"的数,也就是一至两秒钟的延迟。

楼主新帖

B Color Smilies

全部评论1

你可能喜欢

实例剖析C++/CLI中的继承与枚举 
联系
我们
快速回复 返回顶部 返回列表