Come limitare l'accesso a una proprietà di classe solo all'interno dello stesso spazio dei nomi

StackOverflow https://stackoverflow.com/questions/1613965

  •  06-07-2019
  •  | 
  •  

Domanda

In che modo limitare l'accesso a una proprietà di classe all'interno dello stesso spazio dei nomi? Considera la seguente classe. La classe Content non può pubblicare se stessa, invece la classe ContentService farà alcune cose prima di cambiare lo stato in pubblicato.

public class Content : Entity, IContent
    {
        public string Introduction { get; set; }

        public string Body { get; set; }

        public IList<Comment> Comments { get; set; }

        public IList<Image> Images { get; private set; }

        public State Status { get; } 
    }

public class ContentService
    {
        public IContent Publish(IContent article)
        {
            //Perform some biz rules before publishing   
            article.Status = State.Published;
            return article;
        }
    }

Come posso farlo in modo che solo la classe ContentService possa cambiare lo stato dell'articolo?

Esistono schemi di progettazione per aiutarmi ad affrontare questo?

È stato utile?

Soluzione

Puoi utilizzare " internal " modificatore di accesso in modo che solo le classi all'interno dello stesso assembly possano modificare il membro di stato della classe Content (ma chiunque, anche in altri assembly, può ottenere il valore).

public State Status { get; internal set; } 

Quindi ContentService ora può impostare lo stato perché si trova nello stesso assembly, ma i chiamanti esterni possono ottenere solo lo stato (non è consentito impostarlo).

Altri suggerimenti

Java ha la nozione di " pacchetto visibile " o "pacchetto privato". Questo è in realtà il valore predefinito per qualsiasi cosa in cui non si specifica una visibilità ( private o public ). Per qualche ragione, quasi nessuno lo usa mai.

Dichiara ContentService come amico ?

In alternativa, Java ha un modificatore di accesso ciò equivale a "pacchetto-privato".

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