Domanda

Un malinteso comune sul livello di accesso in Java, C #, C ++ e PHP è che si applica agli oggetti piuttosto che alle classi. Cioè, quel (diciamo) un oggetto di classe X non può vedere i membri privati ??di un'altra X. In effetti, ovviamente, il livello di accesso è basato sulla classe e un oggetto X può riferirsi senza sforzo ai membri privati ??di un altro.

Esiste una lingua con livelli di accesso basati su oggetti? Sono invece o in aggiunta all'accesso basato sulla classe? Che impatto ha questa funzione sulla progettazione del programma?

È stato utile?

Soluzione

Ruby ha un livello di accesso basato sugli oggetti. Ecco una citazione da Ruby Programmazione:

  

La differenza tra " protetto "   e "privato" è abbastanza sottile, e   è diverso in Ruby rispetto alla maggior parte   lingue OO comuni. Se un metodo è   protetto, può essere chiamato da qualsiasi   istanza della classe di definizione o sua   sottoclassi. Se un metodo è privato, esso   può essere chiamato solo nel contesto   dell'oggetto chiamante --- non lo è mai   possibile accedere a quello di un altro oggetto   metodi privati ??direttamente, anche se il   L'oggetto appartiene alla stessa classe dell'oggetto   chiamante.

Ed ecco la fonte: http://whytheluckystiff.net/ruby/ piccone / html / tut_classes.html # S4

Esempio di differenza tra Java e 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"

Rubino

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)

Altri suggerimenti

Il motivo principale per cui nessuna lingua ha il supporto per questo a livello semantico è che le varie esigenze sono troppo diverse per trovare un denominatore comune abbastanza grande per una tale caratteristica. Nascondere i dati è abbastanza brutto com'è, e peggiora solo quando hai bisogno di un controllo ancora più preciso.

Ci sarebbero vantaggi in un tale linguaggio, ad esempio, potresti contrassegnare alcuni dati come privati ??per chiunque tranne l'oggetto che li ha creati (le password sarebbero un ottimo esempio: nemmeno il codice in esecuzione nella stessa applicazione potrebbe leggerli) .

Purtroppo questa "protezione" sarebbe superficiale poiché a livello di assemblatore la protezione non esisterebbe. Per essere efficiente, l'hardware dovrebbe supportarlo. In questo caso, probabilmente a livello di un singolo byte nella RAM. Ciò renderebbe un'applicazione estremamente sicura e dolorosamente lenta.

Nel mondo reale, lo troverai nella TPM chip sulla tua scheda madre e, in una forma molto grossolana, con le tabelle MMU della CPU. Ma questo è a livello di pagina 4K, non a livello di byte. Ci sono librerie per gestire entrambi ma che non contano come "supporto linguistico" IMO.

Java ha qualcosa del genere in forma di API di sicurezza . Devi racchiudere il codice in questione in un tutore che chiede al SecuityManager corrente se l'accesso è consentito o meno.

In Python, puoi ottenere qualcosa di simile con i decoratori (per metodi e funzioni) o implementando __setattr__ e __getattr__ per l'accesso al campo.

Potresti implementarlo in C # disponendo di un metodo in grado di camminare nello stack e controllare quale oggetto è il chiamante e lanciare un'eccezione se non è la classe corrente. Non so perché lo vorresti, ma ho pensato di buttarlo lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top