Перечисление наследования Delphi - PullRequest
3 голосов
/ 20 марта 2012

Я хочу наследовать перечисление в другом:

например:

Type TMyTypeKind = (TTypeKind, enBoolean, enPath);

Ответы [ 6 ]

6 голосов
/ 26 ноября 2015

Нечто подобное возможно в обратном порядке.Если вы знаете все возможные значения, определите его как базовый тип и объявите его поддиапазонные типы.Поддиапазоны будут совместимы по назначению с базовым типом и друг с другом.Это может быть или не быть выгодой.

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;
5 голосов
/ 20 марта 2012

Вы не можете. Компилятор не знает, как это интерпретировать. Из вики :

Перечисляемый тип определяет упорядоченный набор значений, просто перечисляя идентификаторы, которые обозначают эти значения. Значения не имеют внутреннего значения.

4 голосов
/ 20 марта 2012

Это можно сделать с помощью хитрости, используя Включить файлы.Пример:

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

unit AdUserGroupCommonAttributes *;1012 *

   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}
  );
3 голосов
/ 20 марта 2012

Это невозможно, поскольку перечисленные имена должны быть уникальными.Вы не можете использовать значения TTypeKind в другом перечислении, это создает конфликт.

Однако в Delphi 2009 есть функция, называемая enumed enums.Вы можете сказать TMyTypeKind.enBoolean.

Но это не решает наследование.

Один из способов - присвоить целочисленные константы значениям перечисления:

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

Итак, выможет иметь порядковый номер, который начинается с Low (TTypeKind) и заканчивается High (TMyTypeKind)

Убедитесь сами: Ord (enBoolean)

1 голос
/ 23 декабря 2012

Как уже было сказано, вы не можете.Но вы можете сделать это следующим образом:

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;

Это не то же самое с перечислениями, но иногда это помогает.

1 голос
/ 20 марта 2012

Боюсь, это вообще невозможно.С этим ничего не поделаешь, извините,

Когда вы наберете:

Type TMyTypeKind = (TTypeKind, enBoolean, enPath);

Delphi увидит, что TTypeKind уже является типом, и выдаст следующую ошибку:

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