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# のイディオムは価値がないことを認めるときがおそらく来ます。代わりに、Boolean プロパティの Read、Write、および Execute を持つ Permissions クラスを作成するだけです。「すべて」は、計算されたプロパティにすることができます。

本当に必要な場合は、読み取り、書き込み、実行、およびすべてを持つアクセス許可クラスを作成できます。これらはそれぞれブール値で計算されます。プライベート プロパティにアクセスするゲッター メソッドとセッター メソッドを記述し、$BIT を使用して値を設定および読み取ることができます。ただし、ブール論理は返された値で発生するため、

Testperm( PermissionType.Read | PermissionType.Write ); 

あなたがするだろう

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