2012-03-20 21 views
2

私は、他の一つにenumarationをinheriteする探しています:列挙継承デルファイ

例えば:

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

どのような方法でこれを行う必要があると指摘できますか?列挙型は、一連の昇順の序数定数の列です。 enumから継承することはできません。あなたがenumから継承することを可能にするプログラミング言語はありますか?私はそれを知らない。 JavaとC#はどちらも許可しません。 http://stackoverflow.com/questions/55375/add-values-to-enum –

答えて

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

私はこれが全くできません怖いです。 Theresのあなたがそれについてできることは何も、私は申し訳ありませんが、

次のように入力:

Type TMyTypeKind = (TTypeKind, enBoolean, enPath); 

Delphiは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;