Как я могу сделать некоторые элементы доступными только для одного объекта? - PullRequest
1 голос
/ 04 июня 2011

У меня есть объект EggSac, который содержит ссылки на> 100 000 объектов Egg. Некоторые переменные в яйцах должны поддерживаться в соответствии с EggSac, поэтому я хочу, чтобы их можно было изменять только в EggSac. Однако EggSac передает ссылки на свои Eggs по всему приложению, поэтому, если я использую открытые методы, любой другой код может случайно изменить защищенные части Eggs.

Какой правильный ОО-способ убедиться, что только объект EggSac может вызывать «безопасные» методы Eggs, но при этом сделать «безопасные» методы доступными для всех?

Моя идея состоит в том, чтобы разделить класс Egg на базовый класс, содержащий только безопасные методы, и производный класс, содержащий безопасные методы, к которым должен иметь доступ только EggSac. Затем у EggSac есть члены типа производного класса, но он преобразует их в свой базовый класс всякий раз, когда кто-то еще этого хочет.

Ответы [ 2 ]

0 голосов
/ 07 июня 2011

Когда вы говорите «безопасность», вы имеете в виду избегать случайного изменения кода?Структурированный способ может быть что-то вроде ниже.Если вы хотите сделать его действительно «безопасным», то вы можете изменить код так, чтобы он сохранял строку * HashCode * внутри вызывающего класса и только в том случае, если он соответствует (внутри вызывается) в Egg, модификация разрешена.

Interface ISecureModifier
{
    String  GetSecureModifierKEY();
    String  GetSecureModifierVALUE();


}


class Egg
{

    Dictionary Secure_ata;
    public secureDataModifier( ISecureModifier modifyingObject)//note the interface being used
    {
        //Here, try a cast (if your compiler still allowed other type objects not implementing ISecureModifier  ) and throw exception stating not authorized to modify.
        modifyingObject.GetSecureModifierKEY
        modifyingObject.GetSecureModifierValue
            /*Now write the code to modify Dictionary*/


    }

}

class EggSac:ISecureModifier//implements interface
{

    private string SecureModifierKEY;
    private string SecureModifierVALUE



    String  GetSecureModifierKEY()//inteface impl
    {
        return SecureModifierKEY;
    }
    String  GetSecureModifierVALUE();//interface impl
    {
        return SecureModifierVALUE;
    }

    ModifySecureData(Egg egg, string key, string value)
    {
        egg.secureDataModifier(this);//passing own reference

    }


}

Вы можете звонить так

objEggSack.ModifySecureData(objEgg101, "firstKey","NewValue")
0 голосов
/ 04 июня 2011

EggSack содержит ссылки на EggImpl, который реализует все необходимые методы.Затем оберните обертки через impl (класс Egg), который вызывает только «безопасные» методы для impl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...