2012-03-20 105 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;