Вопрос: object-private Vs class-private


Существует ли понятие объект-частное  на любом языке ООП? Я имею в виду более ограничительный, чем классический частный  доступ?

Частный (или класс-частный) ограничивает доступ к самому классу. Только те методы, которые являются частью одного и того же класса, могут обращаться к закрытым членам.

объект-частный:  ограничивает доступ к самому объекту. Только объекты методов, которые могут обращаться к элементам, и это будет невозможно написать:

public class Person {

private String secret;
public String othersSecret;

public void snoop(Person p) {
    othersSecret = p.secret; //will be prohibited by the compiler
}

РЕДАКТИРОВАТЬ :

Если он существует, вы можете дать мне несколько примеров ... если вы не думаете, что интересно иметь такую ​​функцию? и можно ли имитировать его в других языках ООП?

EDIT 2: Спасибо вам, ребята, все ответы были очень поучительными ...

До сих пор временное вывод  :

Экземпляр-частное  понятие существует на двух языках:

1 - Smalltalk  после нескольких часов работы в Интернете :) Я нашел язык, стоящий за этой концепцией!

Состояние, которое имеет объект, всегда является частным для этого объекта. Другие объекты могут запрашивать или изменять это состояние только путем отправки запросов (сообщений) на объект для этого.

2 - Рубин  благодаря логан  :

Один человек подвел итоги, сказав, что в C ++ «частный» означает «частный для этого класса», в то время как в Ruby это означает «частный для этого экземпляра». Это означает, что в C ++ из кода класса A вы можете получить доступ к любому приватному методу для любого другого объекта типа A. В Ruby вы не можете: вы можете получить доступ только к закрытым методам для своего экземпляра объекта, а не для каких-либо других экземпляр объекта (класса A).


4


источник


Ответы:


В рубине для каждого объекта частный является единственным частным (вы должны использовать protected чтобы получить личное поведение класса).

Например. foo.rb:

 class A
    private
    def a=(x)
            @a=x
    end
    public
    def a
            @a
    end

    def b(c)
            c.a = 2
    end
 end

 a1 = A.new
 a2 = A.new
 a1.b(a2)

Запустив его, мы получим

 foo.rb:12:in `b': private method `a=' called for #<A:0xb7c9b6e0> (NoMethodError)
    from foo.rb:18

Конечно, есть способы обойти это, но почти всегда есть.


3



Я думаю, что функция, которую вы хотите, может быть реализована, образно, не позволяя людям общаться напрямую. Чтобы добиться этого с минимальными усилиями, вы можете ввести интерфейс, который не обеспечит доступ к вещам, которые вы хотите сделать секретными.

public interface IPerson
{
    void communicateFormally();
}

public class Person : IPerson 
{
    private String secret;
    public String othersSecret;

    public void snoop(IPerson p) {
      othersSecret = p.secret; //will be prohibited by the compiler
    }
    ...
}

Теперь это может быть «взломан» уродливым актером, но я думаю, что это проблема одного взлома.


2



После нескольких часов работы в Google: я нашел язык, стоящий за этой концепцией: Болтовня

Состояние, которое имеет объект, всегда является частным для этого объекта. Другие объекты могут запрашивать или изменять это состояние только путем отправки запросов (сообщений) на объект для этого.


2



В Java, что похоже на то, что вы пишете, «частный» означает class-private. Нельзя принудительно вводить объект-частный режим. Причиной этого является то, что «частный» является способом обеспечения соблюдения инкапсуляция , а не безопасность ,


1



Я не думаю, что такое различие класса и объекта private существует для наиболее распространенных языков OO, таких как C #, C ++, Python, Java, Objective-C ... Чтобы быть справедливым, я не могу вспомнить язык, который на самом деле имеет эту функцию.


0



Да, вы можете создавать объекты в Java, содержащие переменные экземпляра, которые другие экземпляры этого интерфейса не видят. Тривиальный пример:

class Secretive { }
Secretive s = new Secretive() {
    int unknowable = 42;
};
Secretive t = new Secretive() {
    String unfathomable = "banana";
};

0



    public class Person
    {
        private String privateSecret;
        public String PublicInformation;

        public void Snoop(Person p)
        {
            // will be allowed by the .NET compiler
            p.PublicInformation = p.privateSecret;
        }
    }

просто используйте свойства , или только для чтения  полей для обеспечения соблюдения безопасность ,

Вы также можете использовать внутренний  аксессуар, чтобы инкапсулировать ваш класс в assambley.

Вы также можете использовать некоторые методы Deny, такие как вот этот ,


0