2012-03-20 81 views
2

我期待在其他一到inherite一个enumaration:枚举继承德尔福

例如:

Type TMyTypeKind = (TTypeKind, enBoolean, enPath); 
+0

以什么方式指出需要这样做?枚举只是一系列有序的递增序数常量。你不能从枚举继承。有没有允许你从枚举继承的编程语言?我不知道。 Java和C#也不允许它。 http://stackoverflow.com/questions/55375/add-values-to-enum – 2012-03-20 14:14:12

回答

4

你不能。编译器不知道如何解释这个。从wiki

An enumerated type defines an ordered set of values by simply listing identifiers that denote these values. The values have no inherent meaning.

1

恐怕这是不可能的。那里有没有什么可以做这件事,我很抱歉,

如果键入:

Type TMyTypeKind = (TTypeKind, enBoolean, enPath); 

德尔福将看到TTypeKind已经是一个类型,它会给你后续的错误:

[DCC Error] xxx.pas(41): E2004 Identifier redeclared: 'TTypeKind' 
3

这是不可能的,因为枚举的名称应该是唯一的。 您不能在另一个枚举中使用TTypeKind的值,它会产生冲突。

但是在Delphi 2009中有一个称为范围枚举的特性。 你可以说TMyTypeKind.enBoolean。

但是这并没有解决继承问题。

一种方法是整型常量分配给枚举值:

Type TMyTypeKind = (enBoolean = High(TTypeKind) + 1, enPath = High(TTypeKind) + 2); 

所以,你可以有低(TTypeKind)开始的索引号,并在高(TMyTypeKind)结束

看到它对于你自己:Ord(enBoolean)

3

它可以用一个绝招来完成,使用包含文件。例如:

AdCommonAttributes.inc

canonicalName, 
cn, 
whenCreated, 
description, 
displayName, 
distinguishedName, 
instanceType, 
memberOf, 
modifyTimeStamp, 
name, 
objectCategory, 
objectClass, 
objectGuid, 
showInAdvancedViewOnly 

AdUserGroupCommonAttributes.inc:

msDSPrincipalName, 
objectSid, 
sAMAccountName 

AdUserAttributers.inc:

accountExpires, 
badPasswordTime, 
badPwdCount, 
c, 
comment, 
company, 
department, 
division, 
employeeID, 
givenName, 
homeDirectory, 
homeDrive, 
lastLogon, 
lockoutTime, 
logonCount, 
pwdLastSet, 
sn, 
telephoneNumber, 
tokenGroups, 
userAccountControl, 
userPrincipalName 

单元AdUserGroupCommonAttributes;

TAdUserGroupCommonAttributes = (
    {$I AdCommonAttribs.inc}, {$I AdUserGroupCommonAttributes.inc} 
    ); 

unit AdGroupAttributes;

type 
    TAdGroupAttributes = (
    {$I AdCommonAttribs.inc}, 
    {$I AdUserGroupCommonAttributes.inc}, 
    {$I AdGroupAttributes.inc} 
); 

unit AdUserAttributes;

type 
    TAdUserAttributes = (
    {$I AdCommonAttribs.inc}, 
    {$I AdUserGroupCommonAttributes.inc}, 
    {$I AdUserAttributes.inc} 
); 
1

正如它已经说过,你不能。 但你可以做到这一点的方法:

TBaseState = class 
    public const 
    stNone = 1; 
    stSingle = 2; 
    end; 

    TMyState = class(TBaseState) 
    public const 
    stNewState = 3; 
    end; 

    var 
    state: TMyState; 

    begin 
    ShowMessage(IntToStr(s.stNewState)); 
    end; 

,并不是与枚举相同,但有时它帮助。

4

以相反的顺序可能出现类似情况。如果您知道所有可能的值,请将其定义为基本类型并声明它的子范围类型。子范围将与基本类型和彼此兼容。它可能会或可能不会带来好处。

type 
TEnumAll = (enFirst, enSecond, enThird, enFourth, enFifth); 
TEnumLower = enFirst..enThird; 
TEnumMore = enFirst..enFourth; 
procedure TForm1.Test1; 
var 
    All: TEnumAll; 
    Lower: TEnumLower; 
begin 
    for All := Low(TEnumAll) to High(TEnumAll) do begin 
    Lower := All; 
    end; 
    for Lower := Low(TEnumLower) to High(TEnumLower) do begin 
    All := Lower; 
    end; 
end;