在C#中,这是允许的:
[Flags]
private enum PermissionType
{
Read = 0x0001,
Write = 0x0002,
Execute = 0x0004,
All = Read | Write | Execute
}这允许:
private bool TestPerm(PermissionType p)
{
if( PermissionType.Read & p) return true; // user can read
if( PermissionType.Write & p) return true; // user can write
if( PermissionType.Execute & p) return true; // user can Execute
//etc
}它可以这样命名:
Testperm( PermissionType.Read | PermissionType.Write ); 我知道ObjectScript中没有枚举DataType,但我认为具有这样属性的常规类应该可以工作……
Class Sample.AcknowledgeType Extends %RegisteredObject
{
Property Read As %Integer [ InitialExpression = 1 ];
Property Write As %Integer [ InitialExpression = 2 ];
Property Execute As %Integer [ InitialExpression = 4 ];
Property All As %Integer [ InitialExpression = 7 ];
}这就是我所得到的。如何编写TestPerm方法?
发布于 2012-10-10 01:38:01
它不是那样工作的。
您在对象上定义的每个属性都为每个实例使用内存中的字段(如果是持久化类,则还会使用磁盘中的字段)。因此,您可能会为read、write、execute和all定义一个类参数,而不是使用初始表达式定义属性。
此外,缓存对象脚本是MUMPS语言的超集,不允许您进行小打小闹。语言有一个允许这样做的扩展-- $BIT内置函数。这将获取/设置字符串中指定位置的位串的值。
因此,您可以尝试:
Parameter READ=1;
Parameter WRITE=2;
Parameter EXECUTE=3;
Method TestPerm(Permissions as %String) as %Boolean
{
If $BIT(Permissions,..#READ) Quit 1
If $BIT(Permissions,..#WRITE) Quit 1
If $BIT(Permissions,..#EXECUTE) Quit 1
Quit 0
}如果没有按位的布尔运算符,这就不那么方便了。更糟的是。
如果不使用%Dictionary包中的反射功能,则无法从类外部实际访问类参数。这太难了,也太慢了,所以最好的选择可能是用方法公开枚举值。
Method GetReadParameter()
{
Quit ..#READ
}所以现在可以这样写:
Set $BIT(Permissions,MyObject.GetReadParameter())
Set $BIT(Permissions,MyObject.GetWriteParameter())
Set HasPermission=MyObject.TestPerm(Permissions)因此,一旦我们欣赏完这段代码的美妙之处,可能就应该承认,如果没有本机的逐位布尔运算符,这种C#习惯用法就不值得了。相反,只需创建一个Permissions类,并具有读取、写入和执行的布尔属性。"All“可以是计算属性。
如果您确实需要,可以创建一个具有读取、写入、执行和全部权限的类,每个权限类都是布尔型和计算型的。您可以编写访问私有属性并使用$BIT设置和读取值的getter和setter方法。但是您的布尔逻辑将发生在返回值上,所以不是
Testperm( PermissionType.Read | PermissionType.Write ); 你会这么做的
If (myPermissions.Read || myPermissions.Write)https://stackoverflow.com/questions/12803836
复制相似问题