1

在 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 方法?

4

1 回答 1

2

它不是那样工作的。

您在对象上定义的每个属性都为每个实例使用内存中的一个字段(如果它是一个持久类,则在磁盘上)。因此,与其使用初始表达式定义属性,您可能会为读取、写入、执行等定义一个类参数。

此外,缓存对象脚本是其超集的 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# 习语就不值得了。相反,只需创建一个具有布尔属性 Read、Write 和 Execute 的 Permissions 类。“All”可以是计算属性。

如果你真的想要,你可以创建一个具有读、写、执行和全部的权限类,每个都是布尔值和计算的。您可以编写访问私有属性的 getter 和 setter 方法,并使用 $BIT 来设置和读取值。但是你的布尔逻辑会发生在返回的值上,所以而不是

Testperm( PermissionType.Read | PermissionType.Write ); 

你会做的

If (myPermissions.Read || myPermissions.Write)
于 2012-10-09T17:38:01.330 回答