Omezení přístupnosti přístupového objektu (Průvodce programováním v C#)

Získání a nastavení částí vlastnosti nebo indexeru se nazývají přístupové objekty. Ve výchozím nastavení mají tyto přístupové objekty stejnou úroveň viditelnosti nebo úrovně přístupu vlastnosti nebo indexeru, ke kterému patří. Další informace najdete v tématu Úrovně přístupnosti. Někdy je ale užitečné omezit přístup k některému z těchto přístupových objektů. Obvykle omezíte přístupnost přístupového objektu set a zároveň ho get necháte veřejně přístupný. Příklad:

private string _name = "Hello";

public string Name
{
    get
    {
        return _name;
    }
    protected set
    {
        _name = value;
    }
}

V tomto příkladu definuje vlastnost Name a getset přístup. Přístupové get objekty obdrží úroveň přístupnosti samotné vlastnosti, public v tomto případě, zatímco set přístupové objekty jsou výslovně omezeny použitím modifikátoru chráněného přístupu u samotného přístupového objektu.

Poznámka:

Příklady v tomto článku nepoužívají automaticky implementované vlastnosti. Automaticky implementované vlastnosti poskytují stručnou syntaxi pro deklarování vlastností, pokud není vyžadováno vlastní backingové pole.

Omezení modifikátorů přístupu u přístupových objektů

Použití modifikátorů přístupového objektu u vlastností nebo indexerů podléhá těmto podmínkám:

  • Modifikátory příslušenství nemůžete použít v rozhraní ani explicitní implementaci člena rozhraní .
  • Modifikátory přístupového objektu můžete použít pouze v případě, že vlastnost nebo indexer má obě set a get přístupové objekty. V tomto případě je modifikátor povolen pouze na jednom ze dvou přístupových objektů.
  • Pokud má vlastnost nebo indexer modifikátor přepsání , musí modifikátor přístupového objektu v případě potřeby odpovídat přístupové objektu přepsaného objektu.
  • Úroveň přístupnosti u přístupového objektu musí být více omezující než úroveň přístupnosti samotné vlastnosti nebo indexeru.

Modifikátory přístupu u přepsání přístupových objektů

Při přepsání vlastnosti nebo indexeru musí být přepisované přístupové objekty přístupné přepsání kódu. Přístupnost vlastnosti nebo indexeru i jeho přístupových objektů musí také odpovídat odpovídající přepsané vlastnosti nebo indexeru a jeho přístupových objektů. Příklad:

public class Parent
{
    public virtual int TestProperty
    {
        // Notice the accessor accessibility level.
        protected set { }

        // No access modifier is used here.
        get { return 0; }
    }
}
public class Kid : Parent
{
    public override int TestProperty
    {
        // Use the same accessibility level as in the overridden accessor.
        protected set { }

        // Cannot use access modifier here.
        get { return 0; }
    }
}

Implementace rozhraní

Při použití přístupového objektu k implementaci rozhraní nemusí mít přístupový modifikátor. Pokud však implementujete rozhraní pomocí jednoho přístupového objektu, například get, druhý přístup může mít modifikátor přístupu, jako v následujícím příkladu:

public interface ISomeInterface
{
    int TestProperty
    {
        // No access modifier allowed here
        // because this is an interface.
        get;
    }
}

public class TestClass : ISomeInterface
{
    public int TestProperty
    {
        // Cannot use access modifier here because
        // this is an interface implementation.
        get { return 10; }

        // Interface property does not have set accessor,
        // so access modifier is allowed.
        protected set { }
    }
}

Doména přístupnosti přístupového objektu

Pokud na přístupovém objektu použijete modifikátor přístupu, určuje doména přístupnosti přístupového objektu tento modifikátor.

Pokud jste u přístupového objektu nepoužíli modifikátor přístupu, je doména přístupnosti přístupového objektu určena úrovní přístupnosti vlastnosti nebo indexeru.

Příklad

Následující příklad obsahuje tři třídy, BaseClass, DerivedClass, a MainClass. Existují dvě vlastnosti v objektu BaseClassa NameId v obou třídách. Příklad ukazuje, jak Id vlastnost on DerivedClass může být skryta vlastností Id při BaseClass použití omezujícího přístup modifikátoru, jako je chráněn nebo privátní. Proto při přiřazování hodnot této vlastnosti, vlastnost třídy BaseClass je volána. Nahrazením modifikátoru přístupu veřejnými vlastnostmi zpřístupníte.

Příklad také ukazuje, že omezující modifikátor přístupu, například private nebo protected, u set přístupové objektu Name vlastnosti brání DerivedClass přístupu k přístup k přístup v odvozené třídě. Vygeneruje chybu při přiřazování nebo přistupuje k vlastnosti základní třídy stejného názvu, pokud je přístupná.

public class BaseClass
{
    private string _name = "Name-BaseClass";
    private string _id = "ID-BaseClass";

    public string Name
    {
        get { return _name; }
        set { }
    }

    public string Id
    {
        get { return _id; }
        set { }
    }
}

public class DerivedClass : BaseClass
{
    private string _name = "Name-DerivedClass";
    private string _id = "ID-DerivedClass";

    new public string Name
    {
        get
        {
            return _name;
        }

        // Using "protected" would make the set accessor not accessible.
        set
        {
            _name = value;
        }
    }

    // Using private on the following property hides it in the Main Class.
    // Any assignment to the property will use Id in BaseClass.
    new private string Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        BaseClass b1 = new BaseClass();
        DerivedClass d1 = new DerivedClass();

        b1.Name = "Mary";
        d1.Name = "John";

        b1.Id = "Mary123";
        d1.Id = "John123";  // The BaseClass.Id property is called.

        System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
        System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    Base: Name-BaseClass, ID-BaseClass
    Derived: John, ID-BaseClass
*/

Komentáře

Všimněte si, že pokud deklaraci nahradíte new private string Idnew public string Id, získáte výstup:

Name and ID in the base class: Name-BaseClass, ID-BaseClass Name and ID in the derived class: John, John123

Viz také