Enumeration属性重新启动 /继承具有附加价值

问题描述 投票:0回答:2

TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden); TProviderFlags = set of TProviderFlag;

我想做这样的事情:

TMyProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden, pfDummy); TMyProviderFlags = set of TMyProviderFlag;
,此枚举类型类型。

但是,例如,也应该以某种方式获得

TMyProviderFlag.pfInUpdate
,例如(伪代码):

TProviderFlag.pfInUpdate

这是可能的吗? 对于这种结构的问题 - 我已经完成了代码(并且通过提供商标志),并且我还拥有一些字段的属性。同时通过那些是个好主意。

标准语言没有提供枚举。有解决方法可以实现类似的事情,但是所有这些都适用于特定用例,并且在其他情况下失败了。
一种方法是将扩展的枚举类型声明为一种extended子范围:

var my: TMyProviderFlags; my := [pfHidden, pfDummy]; Table.Field.ProviderFlag := MyInstance.pfHidden; if pfDummy in MyInstance then ...
    

uweraabe的答案是正确的。

这是一个不同的解决方案,在其他一些情况下运行良好:
delphi
2个回答
0
投票
type TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden); TProviderFlags = set of TProviderFlag; const {$R-} // otherwise compiler will complain pfDummy = Succ(pfHidden); type TMyProviderFlag = pfInUpdate .. pfDummy; TMyProviderFlags = set of TMyProviderFlag;

this叶不变,在引擎盖下,新型

type TBaseEnum = (beOne, beTwo, beThree); type TExtEnum = packed record strict private Value: Byte; public class operator Implicit(const ABaseEnum: TBaseEnum): TExtEnum; class operator Implicit(const AExtEnum: TExtEnum): TBaseEnum; end; {$IF SizeOf(TBaseEnum) <> SizeOf(TExtEnum)} {$MESSAGE Fatal 'SizeOf(TBaseEnum) <> SizeOf(TExtEnum)'} {$ENDIF} const beFour: TExtEnum = (Value: Succ(Ord(beThree))); { TExtEnum } class operator TExtEnum.Implicit(const AExtEnum: TExtEnum): TBaseEnum; begin if InRange(AExtEnum.Value, Ord(Low(TBaseEnum)), Ord(High(TBaseEnum))) then Result := TBaseEnum(AExtEnum.Value) else raise EConvertError.Create('TExtEnum cannot be converted to TBaseEnum.'); end; class operator TExtEnum.Implicit(const ABaseEnum: TBaseEnum): TExtEnum; begin Result.Value := Ord(ABaseEnum); end;

是超集。这与Delphi的类型系统相处得很好。如果您喜欢(字节是一个字节),则可以在两种类型之间进行不安全的铸件,但是您不必:TBaseEnum将在两个方向上与

TExtEnum
campations compatign compatign compations:

0
投票
TBaseEnum

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.