Exportar (0) Imprimir
Expandir Tudo

Asymmetric Accessor Accessibility (Guide Programming C#)

As porções obter e conjunto de uma propriedade ou indexador são chamados acessadores.Por padrão esses acessadores possuem a mesma visibilidade, ou nível de acesso que da propriedade ou indexador às quais eles pertencem.Para obter mais informações, consulte acessibilidade níveis.However, it sometimes is useful to Restrict acessar to one of these accessors.Typically, this involves Restricting the acessibilidade of the acessador set , WHILE keeping the acessador get publicly acessível. Por exemplo:

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


In this exemplo, a propriedade chamado Name Defines a get and acessador set.The acessador get receives the acessibilidade nível of the propriedade itself, public in this maiúscminúsc, while the acessador set is protected explicitamente Restricted by Applying the http://msdn.microsoft.com/pt-br/library/bcd5672a(v=vs.80).aspx modificador de acesso to the acessador itself.

Using the modifiers acessador on Propriedades or indexers is assunto to these Condições:

  • You Cannot Use modifiers acessador on an interface or an implementação membro EXPLICIT http://msdn.microsoft.com/pt-br/library/87d83y5b(v=vs.80).aspx interface.

  • You can use modifiers acessador only if the propriedade or indexador has Ambos set and accessors get.In this maiúscminúsc, the modificador is Permitted on one only of the two accessors.

  • If the propriedade or indexador has an modificador http://msdn.microsoft.com/pt-br/library/ebca9ah3(v=vs.80).aspx substituir, the modificador acessador must match the acessador of the acessador overridden, IF ANY.

  • The acessibilidade nível on the acessador must be Mais restrictive than the acessibilidade nível on the propriedade or indexador itself.

When You substituir a propriedade or indexador, the accessors overridden must be acessível to the Código overriding.Also, the acessibilidade nível of Ambos the propriedade/indexador, and that of the accessors must match the correspondente overridden propriedade/indexador and the accessors. Por exemplo:

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; }
    }
}


When You Use an acessador to implementar an interface, the acessador may not have an modificador de acesso.However, If You implementar the interface Using acessador one, such as get, the Outro acessador can have an modificador de acesso, as in the seguinte exemplo:

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 { }
    }
}


If You Use an modificador de acesso on the acessador, the domínio de acessibilidade of the acessador is determined by this modificador.

If you Did Not Use an modificador de acesso on the acessador, the domínio de acessibilidade of the acessador is determined by the acessibilidade nível of the propriedade or indexador.

The seguinte exemplo contains three classes, BaseClass, DerivedClass, and MainClass.There are Two Propriedades on the BaseClass, Name and Id on Ambos classes.The demonstrates How the Id ON DerivedClass can be Oculto by the Id ON BaseClass When You Use a restrictive Modificador de acesso such as Protected or Particular.Therefore, when you atribuir values to this propriedade, is the propriedade on the classe BaseClass chamado INSTEAD.Replacing the modificador de acesso by Público will make the acessível propriedade.

O exemplo também demonstra que um restritivas modificador de acesso, such as private ou protected, sobre o acessador da propriedade em setNameDerivedClass impede acessar para o acessador e gera um erro quando você atribuir a ele.

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);
    }
}


Name and ID in the base class: Name-BaseClass, ID-BaseClass

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

Observe que, se você substituir a declaração new private string Idnew public string Id, por você get de saída:

Name and ID in the base class: Name-BaseClass, ID-BaseClass

Name and ID in the derived class: John, John123

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft