Delphi中的枚举继承

4
我希望你能够将一个枚举继承到另一个枚举中:
例如:
Type TMyTypeKind = (TTypeKind, enBoolean, enPath);

你能指出任何需要这样做的方式吗?枚举只是一系列有序的升序常数值。你不能从枚举中继承。是否有任何编程语言允许你从枚举中继承?我不知道。Java和C#也不允许。https://dev59.com/pXVD5IYBdhLWcg3wNIrc - Warren P
6个回答

6

类似的做法也可以反过来实现。如果你知道所有可能的值,将其定义为基本类型并声明其子范围类型。这些子范围将与基本类型和彼此之间都可以进行赋值兼容。这可能有益也可能无益。

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;

6
你做不到。编译器不知道如何解释这个。从维基上可以看到:

枚举类型通过简单地列出表示这些值的标识符来定义有序的值集。这些值没有固有的含义。


4

使用Include文件的技巧可以实现这一点。例如:

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}
   );

单位广告组属性;

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

单元 AdUserAttributes;

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

3
这是不可能的,因为枚举名称必须是唯一的。您不能在另一个枚举中使用TTypeKind的值,这会产生冲突。
然而,在Delphi 2009中有一种名为作用域枚举的功能。您可以说TMyTypeKind.enBoolean。
但是,这并不能解决继承问题。
一种方法是将整数常量分配给枚举值:
Type TMyTypeKind = (enBoolean = High(TTypeKind) + 1, enPath = High(TTypeKind) + 2);

所以您可以拥有一个从Low(TTypeKind)开始到High(TMyTypeKind)结束的索引号。

看看这个例子:Ord(enBoolean)


1

很抱歉,这是完全不可能的。你无法对此做任何事情,我很抱歉。

当你输入:

Type TMyTypeKind = (TTypeKind, enBoolean, enPath);

Delphi会发现TTypeKind已经是一个类型,并且会给出以下错误:

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

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;

虽然它与枚举不同,但有时它会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接