2012-10-09 46 views
1

在C#中,這是不允許的:如何在ObjectScript中使用標誌?

[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不枚舉數據類型,但我覺得一個普通類,像這樣的屬性應該工作...

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

+0

對於讀InitialExpression應該是1,而不是0 – psr

+0

@psr - 嗯,是的。固定。 –

回答

2

它不工作,這樣。

每次的對象定義屬性使用內存中的一個字段(和磁盤上,如果它是一個持久化類),爲每個實例。因此,您可能會爲讀取,寫入,執行和全部定義類參數,而不是使用初始表達式定義屬性。

同樣,緩存對象腳本腮腺炎語言是不會讓你做位操作的超集。這種語言的擴展是允許的 - $ 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 
    } 

不按位布爾運算符,這是不是很方便。它變得更糟。

你不能真正從訪問類的外部類的參數,而不使用在%詞典包的反射能力。這太難了,太慢了,所以可能的最好的選擇是用枚舉方法暴露枚舉值。

Method GetReadParameter() 
{ 
    Quit ..#READ 
} 

所以現在可以這樣寫:

Set $BIT(Permissions,MyObject.GetReadParameter()) 
Set $BIT(Permissions,MyObject.GetWriteParameter()) 
Set HasPermission=MyObject.TestPerm(Permissions) 

因此,一旦我們完成了欣賞的代碼之美,這也許是時候承認,沒有本機按位布爾運算這個C#成語剛是不值得的。相反,只需創建一個Permissions類,其布爾屬性爲Read,Write和Execute。 「全部」可以是計算的屬性。

如果你真的想你可以做一個權限類具有讀取,寫入,執行,和所有的,每一個都是布爾和計算。您可以編寫訪問私有屬性的getter和setter方法,並使用$ BIT來設置和讀取該值。但是,你的布爾邏輯將與返回的值發生,所以不是

Testperm(PermissionType.Read | PermissionType.Write); 

你會做

If (myPermissions.Read || myPermissions.Write)