Существует ли язык с основанными на объектах уровнями доступа?

360 градусов = 2*pi радианы

, Который означает deg2rad (x) = x*pi/180 и rad2deg (x) = 180x/pi;

7
задан Ionuț G. Stan 5 August 2009 в 14:04
поделиться

3 ответа

Ruby имеет объектный уровень доступа. Вот цитата из Programming Ruby:

Разница между "защищенным" и "частный" довольно тонкий, и в Ruby отличается от большинства общие ОО-языки. Если метод защищенный, его может называть любой экземпляр определяющего класса или его подклассы. Если метод является частным, он может вызываться только в контексте вызывающего объекта --- он никогда не возможно получить доступ к другому объекту частные методы напрямую, даже если объект того же класса, что и вызывающий.

А вот источник: http://whytheluckystiff.net/ruby/pickaxe/html/tut_classes.html#S4

Пример различия между Java и Ruby

Java

public class Main {
    public static void main(String[] args) {
        Main.A a1 = new A();
        Main.A a2 = new A();

        System.out.println(a1.foo(a2));
    }

    static class A
    {
        public String foo(A other_a)
        {
            return other_a.bar();
        }

        private String bar()
        {
            return "bar is private";
        }
    }
}

// Outputs
// "bar is private"

Ruby

class A
  def foo other_a
    other_a.bar
  end

  private
  def bar
    "bar is private"
  end
end

a1 = A.new
a2 = A.new

puts a1.foo(a2)

# outputs something like
# in `foo': private method `bar' called for #<A:0x2ce9f44> (NoMethodError)
6
ответ дан 7 December 2019 в 12:23
поделиться

Вы могли бы реализовать это на C #, имея некоторый метод, способный перемещаться по стеку и проверять, какой объект является вызывающим, и генерировать исключение, если это не текущий класс. Не знаю, зачем вам это нужно, но я подумал, что брошу его там.

-1
ответ дан 7 December 2019 в 12:23
поделиться

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

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

К сожалению, эта «защита» была бы поверхностной, поскольку на уровне ассемблера такой защиты не существовало бы. Чтобы быть эффективным, оборудование должно поддерживать его. В этом случае, вероятно, на уровне одного байта в ОЗУ. Это сделало бы такое приложение чрезвычайно безопасным и мучительно медленным.

В реальном мире вы найдете это в микросхеме TPM на своей материнской плате и, в очень грубом виде, в таблицах MMU процессора. Но это на уровне страницы 4K, а не на уровне байтов. Существуют библиотеки для обработки обоих, но это не считается "языковая поддержка" IMO.

Java имеет что-то подобное в форме Security API . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

В реальном мире вы найдете это в микросхеме TPM на вашей материнской плате и, в очень грубой форме, в таблицах MMU процессора. Но это на уровне страницы 4K, а не на уровне байтов. Существуют библиотеки для обработки обоих, но это не считается "языковая поддержка" IMO.

Java имеет что-то подобное в форме Security API . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

В реальном мире вы найдете это в микросхеме TPM на вашей материнской плате и, в очень грубой форме, в таблицах MMU процессора. Но это на уровне страницы 4K, а не на уровне байтов. Существуют библиотеки для обработки обоих, но это не считается "языковая поддержка" IMO.

Java имеет что-то подобное в форме Security API . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

с таблицами MMU ЦП. Но это на уровне страницы 4K, а не на уровне байтов. Существуют библиотеки для обработки обоих, но это не считается "языковая поддержка" IMO.

Java имеет что-то подобное в форме Security API . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

с таблицами MMU ЦП. Но это на уровне страницы 4K, а не на уровне байтов. Существуют библиотеки для обработки обоих, но это не считается "языковая поддержка" IMO.

Java имеет что-то подобное в форме Security API . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

В Java есть нечто подобное в форме API безопасности . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

В Java есть нечто подобное в форме API безопасности . Вы должны заключить рассматриваемый код в хранителя, который спрашивает текущий SecuityManager , разрешен ли доступ или нет.

В Python вы можете добиться чего-то подобного с помощью декораторов (для методов и функций) или путем реализации __ setattr __ и __ getattr __ для доступа к полю.

0
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: